J’ai étudié cet appel fork () crée un nouveau processus d’où il est appelé dans le programme.
Mais dans les deux programmes suivants, qui sont très similaires, cela montre un comportement différent. Pourquoi est-ce?
Programme 1:
#include #include int main(int argc, char* argv[]) { printf("Start %d ", getpid()) ; pid_t pid = fork() ; if (pid > 0) printf("Parent %d ", getpid()) ; if (pid == 0) printf("Child %d ", getpid()) ; return 0 ; }
La sortie pour ceci est:
Start 1104 Parent 1104 Start 1104 Child 1105
Programme 2:
#include #include int main(int argc, char* argv[]) { printf("Start %d \n", getpid()) ; pid_t pid = fork() ; if (pid > 0) printf("Parent %d \n", getpid()) ; if (pid == 0) printf("Child %d \n", getpid()) ; return 0 ; }
La sortie pour ceci est:
Start 1126 Child 1127 Parent 1126
Juste inclure “\ n” change la sortie. Qu’est-ce qui cause cela?
Si vous utilisez un stream à la fois dans le parent et dans l’enfant, vous devez le vider avant de fork
. Sinon, tout ce qui rest dans le tampon sera vidé deux fois, une fois par le parent et une fois par l’enfant.
En outre, vous ne devriez pas revenir de main
chez le parent et l’enfant. Si vous le faites, tous les gestionnaires atexit
seront exécutés deux fois. Cela a causé des bogues avec des implications de sécurité dans le passé. Le parent ou l’enfant doit soit appeler _exit
soit appeler l’une des fonctions exec
avec succès.