操作系统实验一、进程控制实验——父子协作进程

问题描述

参考以上示例程序中建立并发进程的方法,编写一个父子协作进程,父进程创建一个子进程并控制它每隔 3 秒显示一次当前目录中的文件名列表。

设计思路

由父进程创建子进程,父进程等待子
进程的完成,子进程中执行 ls 命令再次创建了子进程 ps(不必须要创建两个子进程),之后也是等待子进程的执行,子进程完成 ls 命令后,由于信号量 sleep(3)的设置,间隔 3秒后再次执行该程序,如此循环,直到手动停止。

程序实现

Pctl.c

#include "pctl.h"
int main(int argc, char *argv[])
{
char *args[] = {"/bin/ls","-a",NULL}; //子进程要缺省执行的命令
int pid_1,pid_2; //存放子进程号
int status_1,status_2; //存放子进程返回状态
while(1){
pid_1=fork() ;
if(pid_1<0) // 建立子进程失败?
{
printf("Create Process fail!\n");
exit(EXIT_FAILURE);
}
if(pid_1 == 0) // 子进程执行代码段
{
//报告父子进程进程号
printf("I am Child-ls process %d\nMy father is %d\n",getpid(),getppid());/*getpid 返回当前进程
的进程号,getppid 返回当前进程父进程的进程号*/
pid_2=fork();
if(pid_2<0)// 建立子进程失败?
{
printf("Create Process fail!\n");
exit(EXIT_FAILURE) ;
}
if(pid_2==0) // 子进程执行代码段
{//报告父子进程进程号
printf("I am Child-ps process %d\nMy father is %d\n",getpid(),getppid());
printf("%d child will Running: \n",getpid()); /*子进程被键盘中断信号唤醒继续执行*/
status_2=execve("/bin/ps",NULL,NULL);//装入并执行新的程序
}else{
printf("wait for the ps-child end%d\n",pid_2);
waitpid(pid_2,&status_2,0);//等待子进程 2 结束
//status 用于保留子进程的退出状态
}
printf("%d child will Running: \n",getpid()); //装入并执行新的程序 char *argv[]={"0",NULL};
status_1 = execve("/bin/ls",argv,NULL);
}
else{
printf("I am Parent process %d\n",getpid());
printf("wait for the ls-child end %d\n",pid_1);
waitpid(pid_1,&status_1,0);
printf("child end,sleep...\n");
sleep(3);// sleep 函数会令调用进程的执行挂起睡眠 3 秒
}
}
return EXIT_SUCCESS;
}

运行
在这里插入图片描述

发布了37 篇原创文章 · 获赞 1511 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_43943977/article/details/101833797