zoukankan      html  css  js  c++  java
  • 发现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!
    ");
                    exit(-1);
            }
            else if(pid==0)
            {
                    printf("child  pid[%d]
    ",getpid());
                    sleep(15);
            }
            else
            {
                    printf("parents pid[%d]
    ",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]

  • 相关阅读:
    C#基础
    进制转换
    养猪和存储空间
    独热码和二进制码
    mux_xz
    饮料机
    亚稳态
    mos管功耗
    功能覆盖率和代码覆盖率
    时序逻辑电路输出特点
  • 原文地址:https://www.cnblogs.com/zhangyabin---acm/p/4015692.html
Copyright © 2011-2022 走看看