versuchen Sie dies:
void exit_message (void)
{
// use write to have an unbuffered output
char m[100];
sprintf (m, "%d exit\n", getpid());
write (1, m, strlen(m));
}
main(){
atexit (exit_message);
printf("%d test 1\n",getpid());
fork();
printf("%d test 2\n",getpid());
}
Die Ausgabe wird wie folgt aussehen:
14866 exit // <- parent process flushes its output at exit
14866 test 1 // <- parent process: 1st printf
14866 test 2 // <- parent process: 2nd printf
14867 exit // <- forked process flushes its output at exit
14866 test 1 // <- forked process: unflushed parent process output buffer
14867 test 2 // <- forked process: 2nd printf
wir die einzige printf durch den gegabelten Prozess gemacht sehen die letzte ist, wie erwartet.
Die vorherige Zeile ist ein Ghost des Ausgabepuffers stdout, der vor dem Löschen mit fork() dupliziert wurde.
machen stdout ungepufferte
main(){
atexit (exit_message);
setvbuf(stdout, NULL, _IONBF, 0);
printf("%d test 1\n",getpid());
fork();
printf("%d test 2\n",getpid());
}
des Geistes entledigt
14866 test 1 // <- parent process: 1st printf
14866 test 2 // <- parent process: 2nd printf
14866 exit // <- parent process exits
14867 test 2 // <- forked process: 2nd printf
14867 exit // <- forked process exits
Was passiert, wenn Sie 'fflush (stdout) hinzufügen;' 'vor fork();'? – immibis
Sie vermissen die 'unistd.h'-Kopfzeile. – Mat
@KarolyHorvath +1 die Ausgabe ist 'test1 \ ntest2 \ ntest2' – atupal