php fork 相关函数,C语言fork函数创建进程详解

在linux下,C语言创建进程用fork函数,接下来我们通过代码来一步步了解fork函数的各个知识点。

1、依赖的头文件#include 

2、fork的原理和概念

fork子进程就是从父进程拷贝一个新的进程出来,子进程和父进程的进程ID不同,但用户数据一样。

在C语言中,创建一个子进程代码如下:pid_t pid; //pid_t 从底层来看,实际上是int类型。

pid = fork();

3、父进程和子进程

执行fork函数后有2种返回值:对于父进程,返回的是子进程的PID(即返回一个大于0的数字);对于子进程,则返回0,所以我们可以通过pid这个返回值来判断当前进程是父进程还是子进程。如下代码所示:

if(pid > 0)

{

printf("im parent process, pid: %d\n", getpid());

}

else if(pid == 0)

{

printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());

}

else

{

printf("fork failed\n");

}

温馨提示:

getpid() -获取当前进程的pid

getppid() -获取当前进程的父进程的pid

4、完整例子&子进程代码执行位置

了解这些之后,我们来看一个创建子进程的完整代码示例:

#include    

#include    

int main(int argc, char *argv[])

{

printf("========== before fork =============\n");

pid_t pid;

pid = fork();

printf("========== after fork =============\n");

if(pid > 0)

{

printf("im parent process, pid: %d\n", getpid());

}

else if(pid == 0)

{

printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());

}

else

{

printf("fork failed\n");

}

printf("========== process end =============\n");

sleep(1);

return 0;

}

运行结果如下图:

ce639f91a4ef81a2f6ba28b019e63e49.png

从上图可以看出,程序只输出了1个“before fork”,但输出了2个“after fork”,所以我们可以得出:子进程的代码执行是从fork()位置之后开始的。事实也确实是如此。

5、循环创建子进程

有时候,我们需要创建多个子进程,可以通过for循环来实现,代码如下:

#include    

#include    

int main(int argc, char *argv[])

{

int i = 0;

pid_t pid;

for(i = 0; i 

{

pid = fork();

}

if (pid == 0)

{

printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());

}

else

{

printf("im parent process, pid: %d\n", getpid());

}

sleep(1);

return 0;

}

运行结果如下图:

f3ecdffc79c96dabbd72ed6d7d50cc6d.png

咦,我们不是循环创建3个子进程吗,怎么输出了这么多次parent process和child process呢?

这是因为子进程也创建了子进程,大家可以观察一下图中的pid。数了一下,共输出了8次,刚好是2的3次方。

我画了一个fork步骤图,便于大家更好的理解,如下:

2021a70f530ad80b1b00e04bd5e9b742.png

如上图所示,子进程在第2轮、3轮,也会相当于父进程一样继续fork子进程,所以for循环3次后,刚好得到共8个进程。

那如果我们就想通过循环3次,得到3个子进程,要怎么办呢?

思路:不让子进程fork出新的子进程。

代码片段如下:for(i = 0; i 

{

pid = fork();

if (pid == 0)

{

break;

}

}

运行结果:

4a38be0b41a8ef29c4f9240bfe600cf7.png

至此,fork函数创建子进程介绍完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云AI开发部总经理罗华霖:华为人工智能的实践与创新

来源:亿欧作者:罗华霖概要:9月21-22日,由深圳市罗湖区人民政府指导、亿欧公司主办的“GIIS-全球产业创新峰会”在罗湖区京基100瑞吉酒店盛大启幕。9月21-22日,由深圳市罗湖区人民政府指导、亿欧公司主办的“GIIS-全球产…

oracle drop 提交,oracle drop 存储过程

Oracle中删除用户遇到的问题我新建了一个用户xy,并导入了一些表,序列,存储过程在其中。现在我用删除该用户出现问题执行drop user xy,报错ORA-01922: 必须指定 CASCADE 以删除 XY问题原因CASCADE众所周知是级联的意思,…

Michael I. Jordan——计算思维、推断思维与数据科学

来源:图灵人工智能概要: Michael I. Jordan 是机器学习、统计机器学习泰斗,是贝叶斯网络、概率图模型、层次随机过程等多个重要方向的主要奠基者之一,也是统计学与机器学习交叉融合的主要推动者之一。Michael I. Jordan 是机器学习…

Google Brain 团队的研究方法

来源:全球人工智能概要:大约一年之前,Google Brain 团队首次分享了我们的使命:让机器拥有智慧,造福人类生活。大约一年之前,Google Brain 团队首次分享了我们的使命:让机器拥有智慧,…

Gartner重磅发布近40页PPT,详解2017年十大战略技术趋势

来源:中国大数据概要:Gartner将战略科技发展趋势定义为具有颠覆性潜力、脱离初级阶段且影响范围和用途不断扩大的战略科技发展趋势,这些趋势在未来五年内迅速增长、高度波动、预计达到临界点。 近日Gartner公司着重介绍了在2017年对多个组织具…

巴菲特、李嘉诚、盖茨、小扎、孙正义…… 这是他们眼中的未来

来源:全球创新论坛概要:这些企业家、梦想家和先知在各自的领域中都取得了非凡的成就,创造了巨大的财富,如果让他们展望人类下一个百年,他们会告诉我们什么?为了庆祝百年诞辰,《福布斯》杂志最近…

oracle 01304,关于ORA-01034和ORA-27101的解决方法

[oraclelocalhost admin]$ oerr ora 0130401304, 00000, “subordinate process error. Check alert and trace logs”// *Cause: A process subordinate to this Logminer process has exited with an// error condition.// *Action: Look in the alert log and trace files f…

深度学习不是AI的未来

来源:中国机器人概要:深度学习并不是人工智能的同义词!由于谷歌、Facebook等巨头公司宣传人工智能工具时主要谈的就是深度学习,甚至只谈深度学习,因此大众误以为所有的人工智能新的篇章都(将)由深度学习书写。现在每一个人都正在学…

linux命令解压文件到指定目录并覆盖,你不知道的Linux解压命令

在桌面Linux发行版中解压、压缩都非常方便,直接右键文件就可以了, 但在服务器版的Linux中一般是没有桌面环境的,这时候就要用到命令了。下面我就介绍下等12种格式的压缩文件的压缩和解压的命令。本次为zip文件要使用的命令和命令的用法。建议…

十一来临,国内有哪些手机智能助手帮你出行?

作者:camel概要:手机语音助手已发展多年,随着近几年机器学习的发展,语音助手在语音识别、语义理解等方面已经有了很大的发展。手机语音助手已发展多年,随着近几年机器学习的发展,语音助手在语音识别、语义理…

linux查端口被占用情况,Linux系统中如何查询端口被占用情况

今天小编要跟大家分享的文章是关于Linux系统中如何查询端口被占用情况。正在从事Linux运维工作的小伙伴来和小编来和小编一起看一看吧,希望能够对大家有所帮助。Linux如何查看端口1、lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况…

在分析了AI顶会上的6163篇论文后,我们能发现怎样的发展趋势与变化……

来源:机器人圈概要:最近,有关人工智能(AI)的研究在各个领域都取得了显著的成果。这主要归功于长期以来一直致力于这个研究领域的AI研究人员的努力。最近,有关人工智能(AI)的研究在各…

如果linux目录中没有srv,了解linux系统目录,proc,root,sbin,selinux,srv!

linux小白到大神的成长之路:了解linux系统目录,proc,root,sbin,selinux,srv!本经验由宗龙龙原创,全文共600多字,阅读需要14分钟,如果文中存在错误,还请大家多多指点,我会积极改进的!…

争夺基础架构主导权,AI 新一轮战争将打响?

来源:36氪概要:近日,Applied Materials CEO Gary Dickerson在接受采访时表示,近期,巨头们将会围绕“构建下一代人工智能的基础框架”展开新一轮的战争。经过了这么长时间的“炒作”,人工智能的发展与应用到…

linux配置redis服务,Linux下安装Redis并设置相关服务

一、简介Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。Redis从它的许多竞争继承来的三个主要特点:Redis数据库完全在内存中,使用磁盘仅用于持久性。相比许多键值数据存储…

学术界盛事揭幕:一图解读跨越百余年的诺贝尔奖

来源:科学网概要:金秋十月的第二天,2017年诺贝尔奖颁奖周拉开帷幕,全世界的目光都聚焦到瑞典。金秋十月的第二天,2017年诺贝尔奖颁奖周拉开帷幕,全世界的目光都聚焦到瑞典。在接下来的几天内,物…

shell linux教程,Shell入门基础知识

Shell 简介Shell作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。常常作为批处理命令来使用,用来提…

IBM用量子计算机成功模拟分子,登上《自然》封面

来源:澎湃新闻概要:当地时间9月13日,IBM宣布,在自己的超导量子设备上实现了一种新的量子算法,这种算法可以模拟真实分子,能够高效精确地计算出小分子电子的最低能态(energy state)。…

浅析强化学习及使用Policy Network实现自动化控制

来源:极客头条概要:强化学习已经有几十年的历史,但是直到最近几年深度学习技术的突破,强化学习才有了比较大的进展。浅析强化学习一个强化学习问题包含三个主要概念,即环境状态(Environment State&#xf…

“脑科学”已成大国“必争之地” 看各国都亮哪些大招 | 2030年中国脑计划将闯入“终极疆域” 脑科学将成为大国必争之地

来源:战略前沿技术概要:脑科学的知识将奠定即将到来新时代之基础。凭这些知识我们可医治大量疾病,建造模仿脑功能的新机器,而且更深入地理解我们自己的本质以及我们如何认识世界。一年前,“阿尔法围棋”战胜李世石引来…