У меня проблема, и я не могу ее объяснить.
Проверяя valgrind
на наличие утечек памяти, я заметил, что порядок, в котором программа печатает, отличается от порядка, который я получаю, если я просто запускаю исполняемый файл моей программы.
Я сократил свою программу так, чтобы она компилировалась, чтобы показать, в чем проблема.
Когда я компилирую и запускаю следующий код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void)
{
printf("I am %d\n", (int)getpid() );
pid_t pid = fork();
printf("Fork returned %d\n", (int)pid );
if ( pid < 0 ){
perror("Fork Faild\n");
exit(1);
}
if ( pid == 0 ){
printf("I am the child with pid %d\n", (int)getpid());
sleep(5);
printf("Child exiting...\n");
exit(0);
}
printf("I am the parent waiting for child to end\n");
wait(NULL);
printf("Parent ending.\n");
return 0;
}
Я получаю следующий результат:
michi@michael ~ $ ./program
I am 18320
Fork returned 18321
I am the parent waiting for child to end
Fork returned 0
I am the child with pid 18321
Child exiting...
Parent ending.
Но когда я проверяю это с помощью valgrind
, я получаю результат в другом порядке:
michi@michael ~ $ valgrind --leak-check=full --track-origins=yes ./program
==18361== Memcheck, a memory error detector
==18361== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==18361== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==18361== Command: ./program
==18361==
I am 18361
Fork returned 18362
Fork returned 0
I am the child with pid 18362
I am the parent waiting for child to end
Child exiting...
==18362==
==18362== HEAP SUMMARY:
==18362== in use at exit: 0 bytes in 0 blocks
==18362== total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
==18362==
==18362== All heap blocks were freed -- no leaks are possible
==18362==
==18362== For counts of detected and suppressed errors, rerun with: -v
==18362== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Parent ending.
==18361==
==18361== HEAP SUMMARY:
==18361== in use at exit: 0 bytes in 0 blocks
==18361== total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
==18361==
==18361== All heap blocks were freed -- no leaks are possible
==18361==
==18361== For counts of detected and suppressed errors, rerun with: -v
==18361== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Я новичок в использовании fork, и я не могу понять, проблема для меня в этом или нет. Почему так происходит?
Это было скомпилировано на Linux Mint 18.2 с GCC 7.