怎么创建多个进程呢?我说那还不容易,看下边代码:

//省略必要头文件

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同时创建多个子进程的方法相关推荐

  1. linux 创建子进程,linux中fork同时创建多个子进程的方法(一)

    Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...

  2. Linux系统【一】CPU+MMU+fork函数创建进程

    切板中的内容输出到文件### 进程相关概念 程序:编译好的二进制文件,在磁盘上,不占用系统资源(不包括磁盘).(剧本) 进程:占用系统资源,是程序的一次运行.(戏剧) 一个程序可以产生多个进程,一个进 ...

  3. Linux中fork()系统调用创建两个子进程

    使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...

  4. linux中fork函数及子进程父进程执行顺序

    目录 一.fork入门知识 二.fork进阶知识 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以 ...

  5. linux创建多个子进程,[Linux进程]使用fork函数创建多个子进程

    #include #include int main (void) { pid_t pid1,pid2;   //进程标识符 pid1 = fork();      //创建一个新的进程 if(pid ...

  6. linux编程取消wait函数,Linux编程基础之进程等待(wait()函数).pdf

    Linux编程基础之进程等待(wait()函数) 编程过程中,有时需要让一个进程等待另一个进程 ,最常见的是父进程等待自己的子进程 ,或者父进程回收自己 的子进程资源包括僵尸进程.这里简单介绍一下系统 ...

  7. linux shell两条命令,Linux最常用的18个Shell命令

    有些人仍然会有这中愚蠢的想法,他们认为使用Linux就必须使用Linux shell命令.胡说!你可以不懂得任何Linux命令,比如说ps,grep,ls等,但是你仍然可以使用很多现代的Linux桌面 ...

  8. linux join两个文件,Linux使用join -a1来合并两个文件

    Linux使用join -a1来合并两个文件 要合并以下两个文件,一起合并在一起,合并到1.txt中 # 1.txt Jerry 20 Alice 30 David 40 # 2.txt Jerry ...

  9. fork 循环创建多个子进程

    循环创建多个子进程 对于以下循环创建进程是什么样的呢? int i = 0; while(i < 3){fork();/*功能代码*/i++; } 子进程创建如下图 学习笔记 对于仅含有一个 f ...

最新文章

  1. Nginx+Apache Yii2.0 配置方案
  2. Android开发学习笔记:数据存取之SQLite浅析
  3. Spring AOP概念理解 (通俗易懂)【转】
  4. springboot设置欢迎页
  5. 当SRS遇到K8s:如何实现高可用、回滚与灰度发布?
  6. 我的嵌入式开发之路(.Net Micro Framework)
  7. python中cock什么意思_[转载]原创脚本逐步实现Autodcock-Vina的虚拟筛选及筛选后分析...
  8. spring 优越性实践
  9. koa2 mysql sequelize_使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
  10. python安装pytesser模块
  11. pod BaiduMapKit 报错解决方案
  12. 计算机课程设计 校园网规划设计与实现,校园网的规划与实现.doc
  13. 项目报告制作-中型无盘网吧
  14. STM32的串口协议
  15. html图片顺时针倾斜50度,html – 使用transform进行垂直对齐:translateY(-50%);里面绝对定位的div...
  16. Task05|joyfulpandas|变形
  17. HDU - 1546 Idiomatic Phrases Game
  18. 【Flink实战系列】Lorg/apache/flink/kafka/shaded/org/apache/kafka/clients/consumer/ConsumerRecord;)Ljava/
  19. matlab三个商人三个随从,商人们怎样安全过河 (附MATLAB程序完整)
  20. 拒酒词,好难找哟,留到有用

热门文章

  1. ASP.NET Core Web API 集成测试中使用 Bearer Token
  2. 好代码是管出来的——使用GitHub
  3. WebAssembly,开发者赢了
  4. Redis -- Hash(哈希) [3]
  5. [转]浅析Tomcat、JBOSS、WebSphere、WebLogic、Apache
  6. 【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录
  7. Android Studio开发基础之自定义View组件
  8. C语言试题九十二之输入数据有多行,第一行是一个整数n,表示测试用例的个数,后面跟着n行 ,每行包括一个由字母和数字组成的字符串
  9. Android之提示Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed
  10. linux之通过strings命令查看so里面是否包含****字符串