发现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]

posted on 2014-10-10 13:47  hrbust_09zhangyabin  阅读(374)  评论(0编辑  收藏  举报