第四题
管道通信
#include"stdio.h"
#include"stdlib.h"
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<signal.h>
#include<string.h>
pid_t pid=0,pid1=0,pid2=0;
void stop(int signum)
{
if(signum==2) //父亲kill两个子进程
{
kill(pid1,SIGKILL);
printf("\nChild Process 1 is killed by Parent!\n");
//sleep(1);
kill(pid2,SIGINT);
printf("Child Process 2 is killed by Parent!\n");
//sleep(1);
wait(NULL);
printf("Parent Process is Killed\n");
kill(getpid(),SIGKILL);
}
}
int main()
{
int fd[2];
int flag=pipe(fd);
if(flag==-1)
perror("pipe error");
int i=0;
for(i=0;i<2;i++)
{
if((pid=fork())==0) break;//子进程直接退出,执行while循环
else if(pid==-1) perror("fork error");
if(i==0)
pid1=pid;
else if(i==1)
pid2=pid;
}
if(pid==0&&i==0)//child1 send
{
//char writebuf[22]={'I',' ','s','e','n','d',' ','m','e','s','s','a','g','e',' ','0',' ','t','i','m','e','s'};
char writebuf[50];
int cnt=1;
close(fd[0]);//close read
while(1)
{
sprintf(writebuf,"I send message %d times",cnt);
cnt++;
//writebuf[15]++;
write(fd[1],writebuf,strlen(writebuf));
sleep(1);
}
}
else if(pid==0&&i==1)//child2 read
{
close(fd[1]);//close send
while(1)
{
char readbuf[50];
read(fd[0],readbuf,50);
printf("%s\n",readbuf);
sleep(1);
}
}
else if(pid!=0)//dad kill child1 and child2
while(1)
signal(SIGINT,stop);
return 0;
}