3 votes

basename_r/dirname_r sous Linux

Certaines fonctions POSIX ne sont pas threadsafe. Les exemples sont dirname et pathname.

La fonction dirname() ne doit pas nécessairement être réentrante. Une fonction qui n'a pas besoin d'être réentrante n'a pas besoin d'être thread-safe.

Sur certaines plateformes, il existe des versions réentrantes de dirname et pathname : nom_de_dirigeant et pathname_r. Pour autant que je sache, il n'y a pas de version réentrante de dirname et pathname sous Linux.

  • Est-ce exact ?
  • Quelle est l'alternative ?

2voto

nos Points 102226

Est-ce exact ?

Selon la page de manuel, oui.

Quelle est l'alternative ?

Rendez-le sûr vous-même, c'est-à-dire enveloppez les appels dans une fonction qui garde basename/dirname et copie le résultat dans un tampon fourni tout en maintenant un mutex.

1voto

rafl Points 8126

Je n'ai pas connaissance de versions réentrantes de dirname y basename dans Linux.

Cependant, il existe plusieurs implémentations réentrantes de ces deux fonctions dans différentes bibliothèques non standard.

g_path_get_dirname y g_path_get_basename de glib sont probablement couramment utilisés, et leur implémentation ne dépend pas trop du reste de la bibliothèque glib non plus, donc il serait assez facile de simplement emprunter leur implémentation si vous n'avez pas particulièrement envie de faire une liaison avec glib.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X