2010-12-06 64 views
3

Le comportement de fork() n'est pas défini s'il existe plusieurs threads dans le processus. Comment puis-je vérifier qu'il n'y a qu'un seul thread (sur linux principalement, mais windows, darwin sont aussi intéressants)?Vérification de la sécurité de fork()

+1

'Saisir un commentaire ici' –

+0

Attendez. Pourquoi n'est-ce pas une vraie question? Y a-t-il eu une modification que j'ai ratée? (Ne voyez pas un historique d'édition cependant?) –

+0

@Matti Virkkunen: La question affichée à l'origine n'avait pas de corps (juste "entrer le code ici") et un titre complètement différent. – eldarerathis

Répondre

2

Sous Linux, le comportement de fork() n'est pas indéfini dans un processus multithread, mais il fait des choses qui ne sont normalement pas très utiles. Ou plutôt, si vous fork() et n'appelez pas immédiatement exec(), vous risquez une fuite de ressources non spécifiées, pouvant inclure des verrous pouvant entraîner un blocage.

Il est certainement possible de demander à Linux (via procfs) combien de threads il y a dans le groupe de threads actuel. Si la réponse est un, cela signifie que le processus est mono-thread.

+0

Oui, c'est ce que j'ai fini par faire (la chose procfs). Nous verrons ce que darwin a dans sa manche. – melisgl

+0

Vous devez vraiment espérer que, après avoir déterminé qu'il y a exactement un thread dans le processus, personne n'a un gestionnaire de signal qui en commence un nouveau avant que vous ne le fassiez. Cela semble improbable, au moins. – MarkR

2

Ce n'est pas possible. Avec pthreads vous pouvez utiliser la fonction pthread_is_multithreaded_np(), mais cela rendrait votre code fork() dépendant de pthreads, et cela ne fonctionnerait pas sur toutes les plateformes. Et il n'y a aucun moyen de faire le contrôle indépendamment de la bibliothèque de threads.

S'il s'agit d'une application, n'utilisez pas de threads et de fourche en même temps. Si vous créez un programme threadé, n'appelez jamais fork() (à l'exception des combos fork/execv).

S'il s'agit d'une bibliothèque, n'utilisez pas fork() ou exigez que la bibliothèque ne soit jamais utilisée avec des applications threadées.

Vous pouvez également utiliser la fonction pthread_atfork(...) pour vous assurer que vous pouvez appeler le fork() en toute sécurité.

+0

pthread_is_multithreaded_np est juste la chose que la création de threads est hors de mon contrôle. – melisgl

+0

Bah, pthread_is_multithreaded_np() n'est pas disponible sur Linux. – melisgl