进程篇:循环创建N个子进程

news/2024/12/29 14:14:58/

进程篇:循环创建N个子进程

标签:fork();N个子进程

从前面的进程篇——fork()可以了解到fork函数会创建父进程和子进程,并且他们在执行的时候,怎么来控制说是先创建父进程,还是先创建子进程呢?其实根据计算机原理来说,父子进程抢占cpu,谁先得到就谁先执行,其实也有一种说法,是父进程先执行的可能性比较大,但是没有理论依据。好了,费话不多说,我们来看代码。
首先,我们先看这样的一段代码:

  1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5     int i;6     pid_t pid;7 //  for(i=0;i<5;i++)8 //  {9         pid = fork();10         if(pid==-1)11             perror("error\n");12         else if(pid==0)13             printf("child,pid=%u,ppid=%u\n",getpid(),getppid());14         else{15 //          sleep(1);                                                       16             printf("father,pid=%u,ppid=%u\n",getpid(),getppid());17             }18 //      }19         return 0;20  21 }

这段代码其实很简单,但是大家看一下结果,就会有问题了:
image
从这个结果,我们可以看出的是,结果输出为什么会出现在命令行中,而不是像平时代码一样,执行完后出现命令行,但是这个确出现在了命令行。我们用命令查看一下,输入命令:

ps aux | grep 2669

得到的结果是:

wz        2669  0.0  0.3   8512  3468 pts/0    Ss   10:21   0:00 bash
wz        6391  0.0  0.0   6124   824 pts/0    S+   20:41   0:00 grep --color=auto 2669

看到这个2669这个进程是bash进程的进程号: 所以产生上面的现象的原因是:
在产生这么多的子进程的时候,bash是不知道这么多的子进程和孙子进程的,在开始的shell命令行中,我们使用./fork的命令,然后shell进程把自己切入到后台,前台是给了fork程序来使用的,shell进程收回前台的命令是在它执行完之后,也就是儿子进程执行完之后,shell会收回前台,在父进程return之后,shell进程就把前台收回了,然后再进入命令行模式中,等待用户输入命令,所以会出现这样的情况,所以解决办法就是保证shell的子进程在最后结束。
好了,解决完上面的问题,我们来看循环子进程的问题。对于循环子进程来说,我们很容易就知道,我们需要fork()函数执行N次,我们用3次来模拟,代码如下:

 1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5     int i;6     pid_t pid;7     for(i=0;i<3;i++)8     {9         pid = fork();10         if(pid==-1)11             perror("error\n");12         else if(pid==0)13             printf("i am %dth child,pid=%u,ppid=%u\n",i+1,getpid(),getppid()    );                                                                          14         else{15             sleep(1);16             printf("i am %dth father,pid=%u,ppid=%u\n",i+1,getpid(),getppid(    ));17             }18         }19         return 0;20  21 }

得到的结果为:

i am 1th child,pid=7222,ppid=7221
i am 2th child,pid=7223,ppid=7222
i am 3th child,pid=7224,ppid=7223
i am 1th father,pid=7221,ppid=2669
i am 2th father,pid=7222,ppid=7221
i am 3th father,pid=7223,ppid=7222
i am 2th child,pid=7225,ppid=7221
i am 3th child,pid=7226,ppid=7222
i am 3th child,pid=7227,ppid=7225
i am 2th father,pid=7221,ppid=2669
i am 3th father,pid=7222,ppid=7221
i am 3th father,pid=7225,ppid=7221
i am 3th child,pid=7228,ppid=7221
i am 3th father,pid=7221,ppid=2669

看起来比较凌乱。但是为什么会出现这么多,我们通过一张图来看一下:
image
从这图很容易看出来子进程产生的过程。
上面的程序我们修改一下,就可以很准确的看到有几个子进程被创建:

 1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5     int i;6     pid_t pid;7     for(i=0;i<5;i++)8     {9         pid = fork();10         if(pid==-1)11             perror("error\n");12         else if(pid==0)13         {14             break;15         }16     if(i<5)                                                                 17     {18         sleep(i);19         printf("i am %dth child\n",i+1);20     }21     else22     {23         sleep(i);24         printf("i am parent\n");25     }26     }27         return 0;28     29 }                   

结果为:

i am 1th child
i am 2th child
i am 3th child
i am 4th child
i am 5th child

这就看起来比较明显了。


http://www.ppmy.cn/news/214744.html

相关文章

日期格式的伟大革新--关于日期格式的压缩算法--减少月份占两位格的表示法

日期格式的伟大革新--关于日期格式的压缩算法--减少月份占两位格的表示法 原创&#xff1a;李均宇 2023-01-09于吴川梅菉 2123-09 众所周知&#xff0c;日期格式通用表示法是&#xff0c;四位年份&#xff0c;两位月份&#xff0c;两位日期 忽发奇想&#xff0c;这可不可以…

靶机渗透练习85-HackathonCTF 1

靶机描述 靶机地址&#xff1a;https://www.vulnhub.com/entry/hackathonctf-1,591/ Description N/A 一、搭建靶机环境 攻击机Kali&#xff1a; IP地址&#xff1a;192.168.9.3 靶机&#xff1a; IP地址&#xff1a;192.168.9.2 注&#xff1a;靶机与Kali的IP地址只需要在同…

vulnhub Hackathon2渗透笔记

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/hackathonctf-2,714/ kali ip地址&#xff1a;192.168.20.130 信息收集 扫描靶机ip地址 nmap -sP 192.168.20.0/24确定靶机ip 进行端口扫描 nmap -A -p 1-65535 192.168.20.134首先我们使用匿名用户登录ftp看看有…

京东产发奔赴港股上市,分拆上市或成互联网大厂的共同选择?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 3月30日晚间&#xff0c;京东集团&#xff08;9618.HK&#xff09;相继发布2则公告称&#xff0c;拟分拆京东智能产发股份有限公司&#xff08;以下简称“京东产发”&#xff09;、京东工业股份有限公司&#xff08;以下简称…

pip runpy.py 报错 pip升级后问题及解决

今天安装了python之后&#xff0c;突然发现pip出问题了&#xff0c;问题指向runpy.py&#xff0c;解决方案在末尾&#xff0c;仔细往下看&#xff01; Traceback (most recent call last):File "c:\program files\python37\lib\runpy.py", line 193, in _run_module…

Android ijkplayer(Gsyvideoplayer)播放视频有声音却黑屏

这个视频格式是flv&#xff0c;推流走的是rmtp&#xff0c;是这个问题的解决我开始是直接百度了下&#xff0c;很多资料显示需要下载安装ubuntu后重新编译&#xff0c;感觉有点麻烦&#xff0c;找github上的issue&#xff0c;发现设置 android:hardwareAccelerated"true&…

GTA5进游戏黑屏但是有声音

进游戏黑屏&#xff0c;有声音&#xff0c;最小化再打开2秒后又卡死 解决方案&#xff1a;改游戏全屏为窗口模式或无边窗口模式

PlayerBase播放黑屏有声音

记录一下用这个框架的问题。。。 android:hardwareAccelerated"true" 这样即可。