【操作系统实验】进程扇和进程链

fork()函数创建子进程以后,fork拷贝了父进程的内存映像,这样子进程就收到一份父进程地址空间的拷贝,之后子进程与父进程分别在自己的地址空间执行相同的指令。
 
fork()的返回值是允许用来区分父进程还是子进程的。函数向父进程返回子进程的进程ID,向子进程返回0,这样就可以在代码中加以区分,是创建子进程以后让父子进程执行不同的操作了。
 
今天尝试的是通过循环调用fork,产生一个n(命令行参数)个进程组成的进程链和进程扇。
 
【进程链】
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char* argv[]){
 int i,n;
 pid_t child_pid;
 if(2 != argc)
 {
  fprintf(stderr,"Usage: %s number.\n",argv[0]);
  return 1;
 }
 n = atoi(argv[1]);
 for(i=1;i<n;i++)
 {
  if(child_pid = fork())
  { 
   break;
  }
   sleep(3);
 }
 
 fprintf(stderr,"i: %d, Process ID: %ld, parent ID: %ld.\n",i,(long)getpid(),(long)getppid());
 return 0;
 
}

每次执行fork()以后,父进程就break跳出,子进程进入下一次循环,作为父进程再创建子进程。这样如果输入命令行参数3,就会产生如下进程链:
1--->2--->3
 
程序执行结果如下:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ ./process 3
i: 3, Process ID: 5999, parent ID: 5998.
i: 2, Process ID: 5998, parent ID: 5997.
i: 1, Process ID: 5997, parent ID: 5379.
gaolu@gaolu-desktop:~$ ./process 3
i: 3, Process ID: 6002, parent ID: 6001.
i: 1, Process ID: 6000, parent ID: 5379.
i: 2, Process ID: 6001, parent ID: 6000.
gaolu@gaolu-desktop:~$
程序的执行结果还是带有一定的随机性,多谢小胖的提醒加了sleep,查阅资料发现进程调度程序选择进程执行的顺序不同可能导致消息的输出顺序变化,如果每次父进程跳出,让子进程sleep一定时间,消息就会按照预想的顺序输出了。
增加sleep以后的输出信息:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ gcc -o process process.c
gaolu@gaolu-desktop:~$ ./process 3
i: 1, Process ID: 6017, parent ID: 5379.
i: 2, Process ID: 6018,  parent ID: 1.
i: 3, Process ID: 6019,  parent ID: 1. 
 
【进程扇】
在上面代码中只要修改判断条件为if(!(child_pid = fork())),就可以保证每次创建子进程以后,子进程break跳出,父进程在下一轮循环继续创建子进程。这样如果输入命令行参数3,就会形成如下进程扇:
    ---2
   |
1---
   |
    ---3
 
程序执行结果:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ gcc -o process process.c
gaolu@gaolu-desktop:~$ ./process 3
i: 1, Process ID: 5913, parent ID: 5912.
i: 2, Process ID: 5914, parent ID: 5912.
i: 3, Process ID: 5912, parent ID: 5379.
gaolu@gaolu-desktop:~$

本文出自 “淡泊明志,宁静致远” 博客,请务必保留此出处http://keren.blog.51cto.com/720558/144895

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值