实验内容
- 设计一个程序,该程序有一个父进程和三个子进程,初始阶段输出如下内容:
- Parent-hello-0
- Child1-hello-1
- Child2-hello-2
- Child3-hello-3
- Parent-hello-4
- 依次类推,每条信息间间隔1s。顺序不能乱。
- 当程序运行一-段时间后,按下CTRL+C, 此时输出如下内容:
- Child3-finished
- Child2-finished
- Child1-finished
- Parent-finished
- 每条信息间隔1s。顺序不能乱。(提示:用signal捕捉信号,kill发送信号)
代码实现
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>
int status=-1;
key_t key;
int msgid;
typedef struct{
long type;
int num;
}Msg;
Msg msg,rcv;
void func_kill(int sig)
{
if(status==0)
{
msgrcv(msgid,&rcv,sizeof(rcv)-sizeof(rcv.type),1,0);
printf("Parent-hello-%d\n",rcv.num);
}
else
{
msgrcv(msgid,&rcv,sizeof(rcv)-sizeof(rcv.type),1,0);
printf("Child%d-hello-%d\n",status,rcv.num);
}
msg.num=rcv.num+1;
msg.type=1;
msgsnd(msgid,&msg,sizeof(msg)-sizeof(msg.type),0);
}
void func_back(int sig)
{
sleep(4-status);
if(status==0)
{
printf("Parent-finished!\n");
}
else
{
printf("Child%d-finished!\n",status);
}
msgctl(msgid, IPC_RMID, NULL);
signal(SIGINT,SIG_DFL);
exit(0);
}
int main()
{
pid_t pid[4]={0,1,2,3};
int i;
pid[0] = getpid();
key= ftok("/home/zk",'6');
msgid = msgget(key,IPC_CREAT|0777);
for(i=1;i<4;i++)
{
pid[i] = fork();
sleep(1);
if(pid[i]<0)
{
printf("The fork is error!\n");
exit(0);
}
else if(pid[i]==0)
{
break;
}
}
signal(SIGINT,func_back);
sleep(4-i);
while(1)
{
if(pid[1]>0&&pid[2]>0&&pid[3]>0)
{
signal(SIGCONT,func_kill);
if(status==-1)
{
status=0;
sleep(2);
printf("Parent-hello-0\n");
msg.type=1;
msg.num=1;
msgsnd(msgid,&msg,sizeof(msg)-sizeof(msg.type),0);
}
sleep(1);
kill(pid[3],SIGCONT);
pause();
}
else if(pid[1]>0&&pid[2]>0&&pid[3]==0)
{
signal(SIGCONT,func_kill);
if(status==-1)
{
status=1;
pause();
}
sleep(1);
kill(pid[2],SIGCONT);
pause();
}
else if(pid[1]>0&&pid[2]==0&&pid[3]==3)
{
signal(SIGCONT,func_kill);
if(status==-1)
{
status=2;
pause();
}
sleep(1);
kill(pid[1],SIGCONT);
pause();
}
else if(pid[1]==0&&pid[2]==2&&pid[3]==3)
{
signal(SIGCONT,func_kill);
if(status==-1)
{
status=3;
pause();
}
sleep(1);
kill(pid[0],SIGCONT);
pause();
}
}
return 0;
}
实验结果
![](https://img-blog.csdnimg.cn/20200601225413648.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxMTYyNzEzODI3Nw==,size_16,color_FFFFFF,t_70)