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

时间: 2024-08-30 11:32:00

发现fork容易出错的一个地方的相关文章

jQuery 使用索引值容易出错的一个地方

先看代码 $('input:eq(2)').attr('value', function(index, val){ console.log(index); //输出0 }); 问:当前元素的索引值,不应该是2吗 :eq(2) ?答:首先要理解 '当前元素',指的是 $('input:eq(2)'),如此一来 $选择到的对象就只有1个,索引值自然也是只有0 我们输出 console.log($('input:eq(2)')); 来看一下就清楚了 console.log($('input:eq(2)

java基础 题和知识点总结, 关于String s是否默认初始化为null......,new一个对象和类静态域,是不是在内存中不是一个地方

一道笔试题 22. 下面代码的运行结果为:() import java.io.*; import java.util.*; public class foo{ public static void main (String[] args){ String s; System.out.println("s=" + s); } } A 代码得到编译,并输出“s=” B 代码得到编译,并输出“s=null” C 由于String s没有初始化,代码不能编译通过 D 代码得到编译,但捕获到 N

发现一个骗粉丝的人后发现博客园的一个bug

发现一个骗粉丝的人后发现博客园的一个bug 当你点开这篇文章的时候,如果你已经登录博客园账号,那么你自动回成为我的博客园粉丝,因为我加了自动关注的js,这里并不是想骗粉丝,希望博客园能重视这个bug(当然博客园肯定知道这个bug的).明天早上我会删除掉这段js的. 起因>发现一个骗粉丝的人 经过>他是如何实现骗粉丝的 我的一些思考 1.发现一个骗粉丝的人 今天下班,打开博客园的时候看到这篇文章,点了进去,感觉排版不错,自定义的界面体验非常不错,职业性地点击了主页看了看,发现了一个问题,于是乎有

苹果平板的按键和电源接线放在一个地方是一个最大的错误

苹果平板的按键和电源接线放在一个地方是一个最大的错误,为什么?我崽使用了一年,电源线接触不良了,要按着按键才能充电.这说明焊锡有松脱问题了.要么电源插口放在别处,不与按键放一处,要么采用感应式的软按键---和案桌的一样,最好是两个方案并用.这维修很复杂的.就拆都够费劲的了,还有焊锡.暗脱的焊锡更烦,还得测电阻. 联想YOGA Tablet 8在这方面考虑比较好.如何再冗余一个专用圆口充电接口就更漂亮了,毕竟充电接口是用的最频繁的了.---两三千的用一年就接触不良的使用体验绝对是一个很差的体验.

Code First迁移数据库时发现在的问题“由于一个或多个对象访问此列”

在执行Update-Database 提示 ClientConnectionId:f7a284b8-411c-406c-98aa-abaacd37eb88 对象'DF__BaiKe_Tit__IsDel__7720AD13' 依赖于 列'IsDelete'. 由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN IsDelete 失败. 解决方法有两种 第一种:在MSSMS里面找到该表直接删除约束即可 第二种: alter table TableName drop con

安全专家发现GE Multilin SR的一个关键漏洞对全球电网构成严重威胁。

A team of researchers from New York University has found a serious vulnerability in some of GE Multilin SR protection relays that poses a serious threat to power grid. 来自纽约大学的一组研究人员发现一些GE Multilin SR保护继电器存在严重的漏洞,对电网构成严重威胁. The experts will provide fu

用iTween实现一个鼠标点击一个地方平面中间出现一个向上抛然后下落的球

首先我们创建一个平面, 就用Cube来创建把,来X和Z设置成10,然后我们就有了一个地形了,然后我们创建需要生成的球,然后我们创建一个空物体,把我们的这个球放到这个空物体下面,然后制作成prefabs,然后我们建一个图标,这里我们就用Cube来代替这个图标,把颜色修改为红色,我们还需要创建一个空物体,让他离我们的地形Y为0.5f,主要是为了在这个地方实例化出球,然后我们在这个空物体上写一个C#脚本, 代码如下: using UnityEngine;using System.Collections

发现Navivat for MySQL有一个数据表分组功能,用起来很方便!

今天用Navivat for MySQL时,发现原来Navivat for MySQL还有这样一个功能,可以对数据表进行分组,这样找起表来就方便多了.一直用SQL Server的时候就希望能有这样的功能,大量的表都混在一起确实很让人抓狂,能有个标记或者分组这样多好,微软也多学习一下.

设置用户帐号只能一个地方登录

这个问题有很多解决方案:1.Ajax定时请求 + 超时判定,也就是2楼说的,如果没有memcache,可以就用写入txt文本的方式储存,给上超时时间时间点,做判断就可以了.另外在客户端写个简单的js脚本,用setInterval()去定时发送一次在线请求给服务端用于更新超时时间.这种方法多用于访问量比较少的地方,如ERP或管理后台等.缺点是如果给一些访问量大的页面,那么无疑是徒增了大量的交互线程占用.2.iframe镶嵌 + connection_aborted()判定,这个方法就是在页面中内置