财讯中国

FORK()函数的理解

来源:网络 2021-12-19 18:16:16

对于刚刚接触Unix/Linux操作系统,在Linux下编写多进程的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。

首先我们来看下fork函数的原型:

#i nclude

#i nclude

pid_t fork(void);

返回值:

负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。

零:在子进程中,fork()返回0

正数:在负进程中,fork()返回正的子进程的PID

其次我们来看下如何利用fork创建子进程。

创建子进程的样板代码如下所示:

pid_t child;

if((child = fork())0)

/*错误处理*/

else if(child == 0)

/*这是新进程*/

else

/*这是最初的父进程*/

fock函数调用一次却返回两次;向父进程返回子进程的ID,向子进程中返回0,

这是因为父进程可能存在很多过子进程,所以必须通过这个返回的子进程ID来跟踪子进程,

而子进程只有一个父进程,他的ID可以通过getppid取得。

下面我们来对比一下两个例子:

第一个:

#include

#include

int main()

{

pid_t pid;

int count=0;

pid = fork();

printf( This is first time, pid = %dn, pid );

printf( This is secONd time, pid = %dn, pid );

count++;

printf( count = %dn, count );

if ( pid>0 )

{

printf( This is the parent process,the child has the pid:%dn, pid );

}

else if ( !pid )

{

printf( This is the child Process.n)

}

else

{

printf( fork failed.n );

}

printf( This is third time, pid = %dn, pid );

printf( This is fouth time, pid = %dn, pid );

return 0;

}

运行结果如下:

问题:

这个结果很奇怪了,为什么printf的语句执行两次,而那句“count++;”的语句却只执行了一次

接着看:

#include

#include

int main(void)

{

pid_t pid;

int count=0;

pid = fork();

printf( Now, the pid returned by calling fork() is %dn, pid );

if ( pid>0 )

{

printf( This is the parent procESS,the child has the pid:%dn, pid );

printf( In the parent process,count = %dn, count );

}

else if ( !pid )

{

printf( This is the child process.n);

printf( Do your own things here.n );

count ++;

printf( In the child process, count = %dn, count );

}

else

{

printf( fork failed.n );

}

return 0;

}

运行结果如下:

现在来解释上面提出的问题。

看这个程序的时候,头脑中必须首先了解一个概念:在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同,将要执行的下一条语句都是if ( pid>0 )……。

两个进程中,原先就存在的那个被称作“父进程”,新出现的那个被称作“子进程”。父子进程的区别除了进程标志符(process ID)不同外,变量pid的值也不相同,pid存放的是fork的返回值。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

1. 在父进程中,fork返回新创建子进程的进程ID;

2.在子进程中,fork返回0;

3.如果出现错误,fork返回一个负值;

fork出错可能有两种原因:(1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。(2)系统内存不足,这时errno的值被设置为ENOMEM。

接下来我们来看看APUE2中对fork的说明:

The new process created by fork is called the child process. This function is called once but returns twice. The only difference in the returns is that the return value in the child is 0, whereas the return value in the parent is the process ID of the new child. The reason the child"s process ID is returned to the parent is that a process can have more than one child, and there is no function that allows a process to o^ain the process IDs of its children. The reason fork returns 0 to the child is that a process can have only a single parent, and the child can always call getppid to o^ain the process ID of its parent. (Process ID 0 is reserved for use by the kernel, so it"s not possible for 0 to be the process ID of a child.)

被fork创建的新进程叫做自进程。fork函数被调用一次,却两次返回。返回值唯一的区别是在子进程中返回0,而在父进程中返回子进程的pid。在父进程中要返回子进程的pid的原因是父进程可能有不止一个子进程,而一个进程又没有任何函数可以得到他的子进程的pid。

Both the child and the parent continue executing with the instruction that follows the call to fork. The child is a copy of the parent. For example, the child gets a copy of the parent"s data space, heap, and stack. Note that this is a copy for the child; the parent and the child do not share these portions of memory. The parent and the child share the text segment (Section 7.6).

关键词: 理解 函数 FORK

相关新闻

走安顺进定西 海信冰箱再现教育扶贫“山海情”
2022-01-17 13:48:41
最强性能二合一轻薄本ROG幻X 1月24日即将开启预约
2022-01-17 13:48:30
小米竖向折叠屏 价格有惊喜主打女性市场
2022-01-17 13:48:19
QQ飞车手游S联赛总决赛 真我GT2系列成2022官方指定用机
2022-01-17 13:48:08
免费获得小米有品会员!小米有品有鱼App3月停运给用户送福利
2022-01-17 13:47:57
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 13:46:06
【手慢无】240GB固态秒杀促销 仅售168元
2022-01-17 12:12:24
AMD新款Radeon Pro专业卡:终于用上6nm
2022-01-17 12:12:16
《永劫无间》再曝新英雄 顾清寒傲立雪中
2022-01-17 12:12:07
三星新品发布会2月9日召开 S22系列即将登场
2022-01-17 12:12:00
12月显卡出货量下降19%,还是涨价的锅
2022-01-17 12:11:52
Intel i5-12400性能暴涨30%!还是超频管用
2022-01-17 12:11:44
黑鲨和玩家同在!新机沿用SSD存储?
2022-01-17 12:11:36
是买不起的样子:3090ti起步2万3
2022-01-17 12:11:27
无线充电加持!曝iPad Pro 6升级M2处理器
2022-01-17 12:11:19
宁德时代:不差钱还融资是为了增产
2022-01-17 12:11:11
好评94%!7万在线!《战神》PC版疯了
2022-01-17 12:11:00
【必买】支持MagSafe磁吸功能 魅族PANDAER“黑化独角兽”手机壳支持iPhone 13系列
2022-01-17 12:10:53
腾讯游戏:寒假打游戏的时间最多14个小时
2022-01-17 12:10:43
1小时游玩假?腾讯春节防沉迷日历发布
2022-01-17 12:10:34
2月9日亮相 Galaxy S22全新配色将来袭
2022-01-17 12:10:23
京东2022年将招聘超2万高校毕业生
2022-01-17 12:10:15
美国拍卖5G频谱 运营商投入超300亿美元
2022-01-17 12:10:06
8088元起 微软Surface Pro 8 商用版正式开售
2022-01-17 12:09:58
起售或是250欧元 Redmi Note 11将在欧洲发布
2022-01-17 12:09:50
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 12:08:06
好料好味道,有礼有年味——京味客祝您虎年福礼满满
好料好味道,有礼有年味——京味客祝您虎年福礼满满
2022-01-17 10:59:35
iPad Pro 6曝光:配置拉满 3月发布 7000起
2022-01-17 10:58:23
非公RTX 3090 Ti显卡海外竟上架:最贵2.9万 翻了一倍
2022-01-17 10:58:14
三星2月9日发布S22系列:真机在官网曝光
2022-01-17 10:58:03
三星S21手机限时立减1450 现3549 今晚截止
2022-01-17 10:56:24
2022年第五届CRO全球责任峰会成功举办
2022年第五届CRO全球责任峰会成功举办
2022-01-17 10:55:22
三星全年卖3亿台手机:卖最多的不是S21
2022-01-17 10:55:01
售价过万!曝三星Galaxy S22 Ultra有1TB版
2022-01-17 10:54:49
2022年PS5必买游戏榜单:照着买没错
2022-01-17 10:54:40
【手慢无】新装机神器 i5-12400F处理器1499元热销
2022-01-17 10:54:30
英特尔13代酷睿或将增大缓存容量 L2 + L3达到68 MB
2022-01-17 10:54:20
功耗爆表 i5-12400超频至 5.2 GHz
2022-01-17 10:54:07
配有手写笔 moto G Stylus手机视频曝光:屏幕开孔位于中央
2022-01-17 10:53:50
小米MIX FOLD2真机上手图曝光 内屏无挖孔
2022-01-17 10:53:38
通话变吵闹?iPhone13移除电话降噪功能
2022-01-17 10:53:25
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 10:49:36
周秉钧韩银山一行参观广东东江纵队纪念馆
周秉钧韩银山一行参观广东东江纵队纪念馆
2022-01-17 09:21:35
小米新机海外发售:竟然比小米12 Pro强
2022-01-17 09:09:34
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 09:08:04
iPad Pro 6曝光:升级M2处理器并支持120HZ高刷新率
iPad Pro 6曝光:升级M2处理器并支持120HZ高刷新率
2022-01-17 08:41:04
苹果新旗舰AR设备曝光:可支持8K分辨率,售价超万元
苹果新旗舰AR设备曝光:可支持8K分辨率,售价超万元
2022-01-17 08:38:24
三星S22 Ultra曝光:12GB+512GB版本售价超万元
三星S22 Ultra曝光:12GB+512GB版本售价超万元
2022-01-17 08:33:04
成本上升!曝AMD EPYC处理器涨价10%~30%!
成本上升!曝AMD EPYC处理器涨价10%~30%!
2022-01-17 08:31:18
中国区12月显卡出货量出炉:七彩虹近20万出货量稳坐第一
中国区12月显卡出货量出炉:七彩虹近20万出货量稳坐第一
2022-01-17 08:28:59
Intel i5-12400全核超频5.2GHz:最大加速功耗117W
Intel i5-12400全核超频5.2GHz:最大加速功耗117W
2022-01-17 08:27:51
微信iOS版更新加入语音暂停功能:长语音消息可暂停并继续播放
微信iOS版更新加入语音暂停功能:长语音消息可暂停并继续播放
2022-01-17 08:26:14
低级错误!火狐浏览器无法上网原因竟是程序员大小写搞错了
低级错误!火狐浏览器无法上网原因竟是程序员大小写搞错了
2022-01-17 08:24:11
藏起来我就用不了了?教你如何在Win11上找出隐藏IE浏览器
藏起来我就用不了了?教你如何在Win11上找出隐藏IE浏览器
2022-01-17 08:22:23
一键切换不用愁!Win11必备小工具让体验更顺手
一键切换不用愁!Win11必备小工具让体验更顺手
2022-01-17 08:18:40
想让Win11运行Win10开始菜单 下载这个小程序 1秒解决
2022-01-17 07:42:21
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 07:40:45
专业卡也用上6nm?AMD新款Radeon Pro专业卡曝光
2022-01-17 06:11:37
PC画质居然更优秀?《战神4》三平台对比
2022-01-17 06:11:29
显卡盲盒!800块有机会抽到RTX3090
2022-01-17 06:11:22
Intel 13代酷睿缓存或将提升至68MB
2022-01-17 06:11:14
三星Galaxy S22发布会将在2月9日23:00开启
2022-01-17 06:11:07
Powerbeats用户集体起诉苹果
2022-01-17 06:10:59
史上最烂《战地》续作!外挂都不想为其更新
2022-01-17 06:10:52
44万人强力围观 小米之家山西分舵开了个话题直接上热搜
2022-01-17 06:10:44
Win11测试出现乱码!中文阅读受到影响
2022-01-17 06:10:34
雷蛇灵刃14发布:标配锐龙9 6900HX 顶配3080Ti 售价1.3万
2022-01-17 06:10:25
美国玩家也氪金!《原神》2021年在美国狂赚近25亿人民币
2022-01-17 06:10:17
小米平板5系列全量更新MIUI13 不会更新的看这里
2022-01-17 06:10:09
苹果首次允许App内第三方支付
2022-01-17 06:10:00
十年了!Windows11新音量调节指示器
2022-01-17 06:09:52
买得起Kindle看不起书 到底谁在为电子水墨屏买单?
2022-01-17 06:09:44
摩托罗拉新机曝光 搭载骁龙SM8475+125W快充
2022-01-17 06:09:34
威刚秀肌肉!PCIe 5.0固态读取速度恐怖!14GB/s
2022-01-17 06:09:25
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 06:08:02
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 22:46:35
曝iPhone 14全系标配120Hz:起售价还是5999
2022-01-16 21:09:44
ROG新品!在CES推出42英寸显示器 OLED面板
2022-01-16 21:09:33
12代酷睿新品!雷神推出游戏/设计新主机
2022-01-16 21:09:21
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 21:08:01
Moto新机曝光,即将开启两亿像素新时代
2022-01-16 19:41:57
小米11系列开启推送MIUI 13系统,公测反馈良好
2022-01-16 19:41:44
红魔7跑分、配置曝光,单核1219,多核3732
2022-01-16 19:40:37
Redmi K50 高配版有望搭载索尼 IMX766 传感器
2022-01-16 19:40:15
解决镀金端子氧化发黑问题 苹果将推新版Lightning充电线
2022-01-16 19:40:02
120Hz高刷 OPPO平板电脑现身跑分网站
2022-01-16 19:39:51
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 19:38:29
2000元到手 骁龙680版Redmi Note11要来
2022-01-16 18:10:05
2月9日见!三星S22系列手机发布会定档
2022-01-16 18:09:49
小米 11 Ultra开启内测NFC“读写勿扰”与“解锁后使用”功能
2022-01-16 18:09:35
后置四摄 红米Redmi Note 11S渲染图曝光
2022-01-16 18:09:21
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 18:08:02
现磨咖啡5元一杯 蜜雪冰城讨好小镇青年
2022-01-16 17:18:11
又一家中资企业打入日本加密货币市场 Amber数亿日元买下持牌交易所
2022-01-16 17:17:59
电动车 没有新革命
2022-01-16 17:17:47
电动车“私桩共享可行吗”引热议 威马汽车创始人给答案
2022-01-16 17:17:37
防疲劳、还是导航信号?高速路上的绿色激光灯有什么用?
2022-01-16 17:17:25
AT&T、Dish和T-Mobile投入数十亿美元购买更多5G频谱
2022-01-16 17:17:14
美国税局可能会对NFT和加密货币征收不同的税
2022-01-16 17:17:03
虚拟偶像满足粉丝想象?专家预警或影响结婚生子
2022-01-16 17:16:50

热门文章

热点专题