linux编程两个子进程,Linux中fork同时创建多个子进程的方法
怎么创建多个进程呢?我说那还不容易,看下边代码:
//省略必要头文件
int main()
{
pid_t pid[2];
int i;
printf("This is %d\n",getpid());
for(i = 0;i < 2;i++ ){
if((pid[0] = fork()) < 0){
printf("Fork() Error!");
exit(-1);
}
if(pid[0] == 0)
printf("This is parent %d,child is %d\n",getppid(),getpid());
else
wait(5);
}
return 0;
}
好,这段代码还是挺简单的,我们的意思是:主线程通过循环创建2个子进程,这时系统中的总进程数应该是3,看看输出结果吧:
这个结果图看的效果不好,我们看个直接点的:
这下你明白了吧,问题没有想象中的那样简单,父进程现在标号为1的循环中创了一个子进程,然后第二次循环,前边的第一个子线程又创建一个子进程,这时明显系统中有四个进程,还是不懂?在下边的时序图吧:
这下你应该明白了吧,好了问题知道了,怎么解决,方法有二;
方法一:直接看代码 for循环
void createsubprocess(int num)
{
pid_t pid;
int i;
for(i=0;i
{
pid=fork();
if(pid==0||pid==-1) //子进程或创建进程失败均退出,这里是关键所在
{
break;
}
}
if(pid==-1)
{
perror("fail to fork!\n");
exit(1);
}
else if(pid==0)
{
printf("子进程id=%d,其对应的父进程id=%d\n",getpid(),getppid());
exit(0);
}
else
{
printf("父进程id=%d\n",getpid());
exit(0);
}
}
这种方法的关键就在于每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作。
方法二:直接看代码 递归函数
void createsubprocess(int num,int max)
{
if(num>=max)return;
pid=fork();
if(pid<0)
{
perror("fork error!\n");
exit(1);
}
//子进程
else if(pid==0)
{
sleep(3);
printf("子进程id=%d,父进程id=%d\n",getpid(),getppid());
}
//父进程
else
{
num++;
if(num==1)printf("父进程id=%d\n",getpid());
if(num
//此处加sleep是为了防止父进程先退出,从而产生异常
sleep(5);
}
}
这里的关键在于递归操作,只有父进程才进入递归创建子进程,子进程不进行这样的操作。
linux编程两个子进程,Linux中fork同时创建多个子进程的方法相关推荐
- linux 创建子进程,linux中fork同时创建多个子进程的方法(一)
Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...
- Linux系统【一】CPU+MMU+fork函数创建进程
切板中的内容输出到文件### 进程相关概念 程序:编译好的二进制文件,在磁盘上,不占用系统资源(不包括磁盘).(剧本) 进程:占用系统资源,是程序的一次运行.(戏剧) 一个程序可以产生多个进程,一个进 ...
- Linux中fork()系统调用创建两个子进程
使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...
- linux中fork函数及子进程父进程执行顺序
目录 一.fork入门知识 二.fork进阶知识 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以 ...
- linux创建多个子进程,[Linux进程]使用fork函数创建多个子进程
#include #include int main (void) { pid_t pid1,pid2; //进程标识符 pid1 = fork(); //创建一个新的进程 if(pid ...
- linux编程取消wait函数,Linux编程基础之进程等待(wait()函数).pdf
Linux编程基础之进程等待(wait()函数) 编程过程中,有时需要让一个进程等待另一个进程 ,最常见的是父进程等待自己的子进程 ,或者父进程回收自己 的子进程资源包括僵尸进程.这里简单介绍一下系统 ...
- linux shell两条命令,Linux最常用的18个Shell命令
有些人仍然会有这中愚蠢的想法,他们认为使用Linux就必须使用Linux shell命令.胡说!你可以不懂得任何Linux命令,比如说ps,grep,ls等,但是你仍然可以使用很多现代的Linux桌面 ...
- linux join两个文件,Linux使用join -a1来合并两个文件
Linux使用join -a1来合并两个文件 要合并以下两个文件,一起合并在一起,合并到1.txt中 # 1.txt Jerry 20 Alice 30 David 40 # 2.txt Jerry ...
- fork 循环创建多个子进程
循环创建多个子进程 对于以下循环创建进程是什么样的呢? int i = 0; while(i < 3){fork();/*功能代码*/i++; } 子进程创建如下图 学习笔记 对于仅含有一个 f ...
最新文章
- Nginx+Apache Yii2.0 配置方案
- Android开发学习笔记:数据存取之SQLite浅析
- Spring AOP概念理解 (通俗易懂)【转】
- springboot设置欢迎页
- 当SRS遇到K8s:如何实现高可用、回滚与灰度发布?
- 我的嵌入式开发之路(.Net Micro Framework)
- python中cock什么意思_[转载]原创脚本逐步实现Autodcock-Vina的虚拟筛选及筛选后分析...
- spring 优越性实践
- koa2 mysql sequelize_使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
- python安装pytesser模块
- pod BaiduMapKit 报错解决方案
- 计算机课程设计 校园网规划设计与实现,校园网的规划与实现.doc
- 项目报告制作-中型无盘网吧
- STM32的串口协议
- html图片顺时针倾斜50度,html – 使用transform进行垂直对齐:translateY(-50%);里面绝对定位的div...
- Task05|joyfulpandas|变形
- HDU - 1546 Idiomatic Phrases Game
- 【Flink实战系列】Lorg/apache/flink/kafka/shaded/org/apache/kafka/clients/consumer/ConsumerRecord;)Ljava/
- matlab三个商人三个随从,商人们怎样安全过河 (附MATLAB程序完整)
- 拒酒词,好难找哟,留到有用
热门文章
- ASP.NET Core Web API 集成测试中使用 Bearer Token
- 好代码是管出来的——使用GitHub
- WebAssembly,开发者赢了
- Redis -- Hash(哈希) [3]
- [转]浅析Tomcat、JBOSS、WebSphere、WebLogic、Apache
- 【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录
- Android Studio开发基础之自定义View组件
- C语言试题九十二之输入数据有多行,第一行是一个整数n,表示测试用例的个数,后面跟着n行 ,每行包括一个由字母和数字组成的字符串
- Android之提示Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed
- linux之通过strings命令查看so里面是否包含****字符串