2010-01-25 4 views
1

Si j'ai bien compris fork() crée un processus fils en copiant l'image du processus parent.fork() et printf()

Ma question concerne la façon dont les processus parents et enfants partagent le flux stdout?

La fonction printf() d'un processus peut-elle être interrompue par d'autres ou non? Ce qui peut provoquer la sortie mixte.

Ou la sortie de la fonction printf() est-elle atomique?

Par exemple:

Le premier cas:

parent: printf("Hello"); 

child: printf("World\n"); 

Console has: HeWollorld 

Le second cas:

parent: printf("Hello"); 

child: printf("World\n"); 

Console has: HelolWorld 

Répondre

4

printf() n'est pas garanti d'être atomique. Si vous avez besoin d'atomicité, utilisez write() avec une chaîne, préformatée en utilisant s*printf() etc., si nécessaire. Même alors, vous devriez faire de la taille des données écrites à l'aide write() est not too big:

demandes d'écriture de {PIPE_BUF} octets ou moins ne doivent pas être intercalées avec des données provenant d'autres processus qui font écrit sur le même tuyau. Les écritures de plus de {PIPE_BUF} octets peuvent avoir des données entrelacées, sur des limites arbitraires, avec des écritures par d'autres processus, que le drapeau O_NONBLOCK des indicateurs d'état de fichier soit activé ou non.

+1

Il n'écrit pas à un tuyau, il écrira (probablement) à un terminal. Donc, même les demandes d'écriture inférieures à PIPE_BUF ne sont pas garanties atomiques. –

0

Le comportement de printf() peut varier (selon les détails exacts de votre système d'exploitation , Compilateur C, etc.). Cependant, en général, printf() n'est pas atomique. Ainsi, l'entrelacement (selon votre 1er cas) peut se produire

1

stdout est généralement mis en mémoire tampon. stderr est généralement non tamponné.