用信号模拟司机售票员问题:创建子进程代表售票员,父进程代表司机 ,同步过程如下:
1 售票员捕捉SIGINT(代表开车),发SIGUSR1给司机,司机捕捉到该信号之后打印(“move to next station”)。
2 售票员捕捉SIGQUIT(代表靠站),发SIGUSR2给司机,司机捕捉到该信号之后打印(“stop the bus”)。
3 司机捕捉SIGTSTP(代表车到总站),发SIGUSR1给售票员,售票员捕捉到该信号之后打印(“all get off the bus”)。
代码如下:
#include<stdio.h>
#include<sys/types.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
static pid_t pid;
void client(int sig)
{
switch(sig){
case SIGINT:
kill(getppid(),SIGUSR1);
break;
case SIGQUIT:
kill(getppid(),SIGUSR2);
break;
case SIGUSR1:
printf("get off bus\n");
kill(0,SIGKILL);
break;
default:
break;
}
}
void server(int sig)
{
switch(sig){
case SIGUSR1:
printf("gogogogo\n");
break;
case SIGUSR2:
printf("stop bus\n");
break;
case SIGTSTP:
kill(pid,SIGUSR1);
break;
default:
break;
}
}
int main(void)
{
if((pid = fork()) < 0){
perror("fork");
exit(1);
}else if(pid == 0){
signal(SIGINT,client); //ctrl+c
signal(SIGQUIT,client); //ctrl+\
signal(SIGUSR1,client);
signal(SIGTSTP,SIG_IGN);
while(1){
pause();
}
}else{
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
signal(SIGUSR1,server);
signal(SIGUSR2,server);
signal(SIGTSTP,server); //ctrl+z
while(1){
pause();
}
}
return 0;
}
结果如下: