更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
要求:
售票员司机(可以持续报站)
用信号模拟司机售票员:创建子进程代表售票员,父进程代表司机。
1:售票员捕捉SIGINT(代表开车),发SIGUSR1 给司机,司机捕捉到SIGUSR1 信号后打印“move to next station”。
2:售票员捕捉SIGQUIT(代表靠站),发SIGUSR2 给司机,司机捕捉到SIGUSR2 信号后打印“stop the bus”。
3:司机捕获到SIGTSTP(车到总站),发SIGUSR1给售票员,售票员捕捉到SIGUSR1信号后打印“all get off the bus”,全部进程结束 。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <signal.h>
char buf[20];
void drive() //售票员捕捉SIGINT,开车
{
printf("drive!\n");
kill(getppid(),10);
}
void stand() //售票员捕捉SIGQUIT,靠站
{
printf("stand!\n");
kill(getppid(),12);
}
void get_off() //售票员收到SIGUSR1,到达总站
{
printf("all get off the bus!\n");
exit(0);
}
void move() //司机捕捉到SIGUSR1,开车
{
printf("move to next station\n");
}
void stop() //司机捕捉到SIGUSR2,靠站
{
printf("stop the bus\n");
}
void arrive() //司机捕捉到SIGTSTP,到达总站
{
printf("arrive!\n");
kill(atoi(buf),10);
}
int main()
{
pid_t id = fork();
if(id == 0) //售票员
{
signal(SIGUSR1,get_off);
signal(SIGINT,drive);
signal(SIGQUIT,stand);
pid_t ID = getpid();
sprintf(buf,"%d",ID);
while(1)
{
printf("\n输入信号!\n");
int n;
scanf("%d",&n);
if(n == 20)
{
kill(getppid(),n);
}
kill(getpid(),n);
sleep(1);
}
}
if(id > 0) //司机
{
signal(SIGUSR1,move);
signal(SIGUSR2,stop);
signal(SIGTSTP,arrive);
}
wait(NULL);
}