- 震惊!!!fork父进程先返回值0,后pid>0,子进程返回值pid等于0
- 平台:
- 问题描述:
- 学习
mmap匿名映射的时候,先mmap,然后fork创建子进程,准备父子进程间通信,但是我用fork的返回值pid判断到底是父进程还是子进程时,父进程竟然也进入了if (0 == pid)的逻辑中,然后父进程也进入了if (pid > 0)的逻辑中,这到底是怎么回事,这个问题先记录下来,等高人解答。
- 代码如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/mman.h>
int main()
{
// create mem reflect don't relay on a file
int *addr = mmap(NULL, 8, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (MAP_FAILED == addr)
{
perror("Error: mmap()");
return -1;
}
pid_t pid = fork();
if (-1 == pid)
{
perror("Error: fork()");
return -1;
}
if (0 == pid);
{
// son
*addr = 3;
printf("child pid=%d, ppid=%d......time 1.....*addr = %d\n", getpid(), getppid(), *addr);
sleep(3);
printf("child pid=%d, ppid=%d......time 2.....*addr = %d\n", getpid(), getppid(), *addr);
// while (1)
// {
// sleep(2);
// }
}
if (pid > 0)
{
// parent
sleep(1);
printf(".......parent pid=%d, son_pid=%d....time 1.....*addr = %d\n", getpid(), pid, *addr);
*addr = 2;
printf(".......parent pid=%d, son_pid=%d....time 2.....*addr = %d\n", getpid(), pid, *addr);
while (1)
{
sleep(1);
}
wait(NULL);
}
munmap(addr, 8);
return 0;
}
- 运行结果,从结果来看,父进程也进入了
if (0 == pid)的逻辑中

结论:
- 在`centos`系统中测试没有这种现象,所以肯定是这个`fedora`系统的`bug`