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.
阅读(1168) | 评论(1) | 转发(0) |