发现fork容易出错的一个地方
今天在看代码时发现一段有意思的代码
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> int main() { int pid=1; if(pid=fork()<0) { perror("fork() error!\n"); exit(-1); } else if(pid==0) { printf("child pid[%d]\n",getpid()); sleep(15); } else { printf("parents pid[%d]\n",getpid()); sleep(15); } return 0; }
先猜一下这段代码的执行结果是什么?
看起来很简单,肯定很多人说结果如下:
child pid[%d]
parents pid[%d]
实际上执行一下,结果如下:
child pid[%d]
child pid[%d]
如果代码改动成 if((pid=fork())<0)
结果就和原先预期的一样:
child pid[%d]
parents pid[%d]
为什么是这样,原因是于运算符优先级的问题。
因为运算符‘<’ 的优先级比运算符‘=’高。所以pid获取的是后面比较表达式的结果,(fork()<0)。这个结果为假,所以pid=0。所以,父进程,子进程都会输出child pid[%d]