实例1:
/* process_state.c /
#include
#include
#include
#include
int main()__
{
int pid;
if(!(pid = fork())) / 子进程始执行*/
{
int i,j,k;
printf("C: This is son, my pid is: %d, my father's pid is %d \n", getpid(), getppid());
printf("C: I'm so busy...\n");
for(i=0; i<10000; i++)
for(j=0; j<10000; j++)
for(k=0; k<50; k++);
printf("C: Now, Let me have a rest. \n");
sleep(15);
printf("C: I want to exit. \n");
exit(0);
}
else /* 父进程执行*/
{
printf("F: This is father, my pid is: %d\n", getpid());
sleep(50);
pid=wait(NULL);
printf("F: My son %d terminated.\n",pid);
sleep(10);
printf("F: Ok, I'm almost finished.\n");
}
}
(1) 认真阅读上述程序,了解程序的基本功能,并仔细思考父进程创建子进程后将从哪里开始继续运行;子进程被创建后,首次得到CPU后将从哪里开始运行。
(2) 打开一个终端窗口,编辑、编译并运行上述程序,观察程序运行的结果是否如你所料。思考,子进程首次得到CPU后从哪个位置开始执行,这到底是通过什么做到的。
(3) 观察父子进程是顺序执行,还是并发执行。
(4) 请再打开另一个终端窗口,用top观察系统中进程的情况,观察所有进程是按什么项目从大到小的顺序依次显示的。
(5) 将top的进程显示顺序按PID从新排序,并在显示界面中只保留USER 、PID、S、COMMAND四个项目。
(6) 在前一个终端窗口中再次运行process_state程序,同时仔细观察top终端窗口显示的内容,了解该程序对应的父子进程在它们的生命周期中的状态经历了哪些变化。