I have a issue which I can not explain it.
Checking with valgrind
for memory leaks I noticed that the order in which the program prints is different from the order which I get if I just run the executable of my program.
I reduced my program so that compiles to show where the issue is.
When I compile and run the following code:
#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;
}
I get the following Output:
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.
But when I check it with valgrind
, I get the Output in another order:
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)
I am new with fork and I can not understand if this is a problem to me or not. Why this happens?
This was compiled on Linux Mint 18.2 with GCC 7.