Chinaunix首页 | 论坛 | 博客
  • 博客访问: 893667
  • 博文数量: 299
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-21 10:07
个人简介

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

分类: LINUX

2014-07-06 16:35:22

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

int main(int argc,char* argv[]){
 int i,n;
int status;
 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  {
  if(child_pid = fork())
  { 
   break;
  }
  sleep(3);
 }
 
 fprintf(stderr,"i: %d, Process ID: %ld, parent ID: %ld.\n",i,(long)getpid(),(long)getppid());
//sleep(5);  //第一种方式
wait(&status);//第二种方式
 return 0;
 
}

每次执行fork()以后,父进程就break跳出,子进程进入下一次循环,作为父进程再创建子进程。这样如果输入命令行参数3,就会产生如下进程链:
1--->2--->3
 
程序执行结果如下:

 gcc -o process process.c

 ./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.
 ./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.
程序的执行结果还是带有一定的随机性,多谢小胖的提醒加了sleep,查阅资料发现进程调度程序选择进程执行的顺序不同可能导致消息的输出顺序变化,如果每次父进程跳出,让子进程sleep一定时间,消息就会按照预想的顺序输出了。
增加sleep以后的输出信息:

 gcc -o process process.c
 ./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
 
程序执行结果:

 gcc -o process process.c
 ./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.
阅读(1128) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

tianyashuibin2014-07-06 16:37:45

进程链代码中提到两种方式:都是要等到子进程终止后再终止父进程。如果父进程在子进程终止前终止,那么子进程就会被init进程接管,getppid()输出的就会使init进程的pid.

pcb在内核中的数据结构是task_struct,由pid可以获得task_struct 关于进程的信息,另一种较为方便的方式是ps命令,如ps -123即可以查看进程123的状态信息。