扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
假定下面程序执行时所对应的第一个进程标识为1000。在它的执行过程中所创建的各进程的标识是由系统按创建顺序递增加1指定的。要求回答下列问题:1)该程序在执行过程中总共会创建多少个进程?给出这些进程(用进程标识表示)间按父子关系所形成的结构。2)给出程序的显示结果,并说明理由。
#include "stdio.h"
#include <unistd.h>
int main(void)
{
int i;
int ProcessID;
int A;
A=0;
for (i=0;i<4;i++)
{
printf("Loop %d: Process ID=%d\n", i, getpid());
A=A+7;
while ((ProcessID=fork())== -1);
if (ProcessID==0)
{
printf(" Process ID=%d, A=%d\n", getpid(), A);
}
else
{
wait(NULL);
}
}
}
程序的显示结果为:
Process ID=3164, A=7
Process ID=3165, A=14
Process ID=3166, A=21
Process ID=3167, A=28
Process ID=3168, A=28
Process ID=3169, A=21
Process ID=3170, A=28
Process ID=3171, A=28
Process ID=3172, A=14
Process ID=3173, A=21
Process ID=3174, A=28
Process ID=3175, A=28
Process ID=3176, A=21
Process ID=3177, A=28
Process ID=3178, A=28
对输出结果的说明如下:
Process ID=3164, A=7
//程序运行,Process ID=3163,第一次循环,i=0,A=7,因此输出“Loop
Process ID=3165, A=14
//进入Process ID=3164,从fork()返回点开始执行,进入下个循环,i=1,输出“Loop
Process ID=3166, A=21
//进入Process ID=3165,进入下一循环,i=2,输出“Loop
Process ID=3167, A=28
//进入Process ID=3166,同理,i=3,输出“Loop
Process ID=3168, A=28
//进程ID=3165进入下一循环,i=3输出“Loop
Process ID=3169, A=21
//进程ID=3164的子进程ID=3165结束,父进程ID=3164中的wait()函数返回,进入下一循环,i=2,创建子进程ID=3169,严格复制父进程,i=2,A=21,调用wait()函数挂起。
Process ID=3170, A=28
//进程ID=3169进入下一个循环,i=3;创建子进程ID=3170,i=3,A=28,并调用wait()挂起。子进程中i=3,循环结束,进程结束。父进程ID=3169由于有子进程ID=3170结束,其中的wait()函数返回,循环结束,进程结束。
Process ID=3171, A=28
//由于ID=3164的子进程ID=3169结束,其中的wait()函数返回,进入下一循环,i=3;创建子进程ID=3171,i=3,A=28,调用wait()函数挂起。子进程ID=3171中i=3,循环结束,进程结束。由于ID=3164的子进程ID=3171结束,其中的wait()函数返回,循环结束,进程结束。
Process ID=3172, A=14
//由于ID=3163的子进程ID=3164结束,其中的wait()函数返回,进入下一循环,i=1,创建子进程ID=3172,i=1,A=14,调用wait()函数挂起。
Process ID=3173, A=21
//进程ID=3172进入下一循环,i=2;创建子进程ID=3173,i=2,A=21,调用wait()函数挂起。
Process ID=3174, A=28
//进程ID=3173进入下一循环,i=3;创建子进程ID=3174,i=3,A=28,调用wait()函数挂起。子进程ID=3174中i=3,循环结束,进程结束。由于ID=3173的子进程ID=3174结束,其中的wait()函数返回,循环结束,进程结束。
Process ID=3175, A=28
//进程ID=3172的子进程ID=3173结束,其中wait()函数返回,进入下一循环,i=3,创建子进程ID=3175,i=3,A=28,调用wait()函数挂起。同上所述,进程ID=3175,3172结束。
Process ID=3176, A=21
//进程ID=3163的子进程ID=3172结束,其中wait()函数返回,进入下一循环,i=2,创建子进程ID=3176,i=2,A=21,调用wait()函数挂起。子进程ID=3176中i=2。
Process ID=3177, A=28
//进程ID=3176进入下一循环,i=3,创建子进程ID=3177,i=3,A=28,调用wait()函数挂起。同上所述,进程ID=3177,3176结束。
Process ID=3178, A=28
//进程ID=3163的子进程ID=3176结束,其中wait()函数返回,进入下一循环,i=3,创建子进程ID=3178,i=3,A=28,调用wait()函数挂起。同上所述,进程ID=3178,3163结束。程序退出。
我认为这个程序输出结果分析的两个重点是:
(1) fork()是对父进程的严格复制,这在子进程i和A的初始值上体现出来。而且子进程是从fork()的返回点开始运行,而不是从程序的最初开始运行。
(2) wait()的返回时间。Wait()函数的作用是挂起本进程以等待子进程的结束,子进程结束时返回。父进程创建多个子进程且已有某子进程退出时,父进程中wait()函数在第一个子进程结束时返回。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者