用信号的知识实现司机和售票员问题。 1)售票员捕捉SIGINT(代表开车)信号,向司机发送SIGUSR1信号,司机打印(let's gogogo) 2)售票员捕捉SIGQUIT(代表停车)信号,向司机发送SIGUSR2信号,司机打印(stop the bus) 3)司机捕捉SIGTSTP(代表到达终点站)信号,向售票员发送SIGUSR1信号,售票员打印(please get off the bus) 4)司机等待售票员下车,之后司机再下车。
时间: 2024-01-25 11:05:06 浏览: 84
售票员和汽车司机的进程同步问题.doc
这里是一个简单的实现:
司机代码(driver.c):
```c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void sig_handler(int signo) {
if (signo == SIGUSR1) {
printf("Let's gogogo!\n");
} else if (signo == SIGUSR2) {
printf("Stop the bus!\n");
} else if (signo == SIGTSTP) {
kill(getppid(), SIGUSR1);
pause();
}
}
int main() {
signal(SIGUSR1, sig_handler);
signal(SIGUSR2, sig_handler);
signal(SIGTSTP, sig_handler);
printf("Driver starts driving...\n");
pause();
printf("Driver stops driving...\n");
return 0;
}
```
售票员代码(conductor.c):
```c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void sig_handler(int signo) {
if (signo == SIGINT) {
kill(getppid(), SIGUSR1);
} else if (signo == SIGQUIT) {
kill(getppid(), SIGUSR2);
} else if (signo == SIGUSR1) {
printf("Please get off the bus!\n");
kill(getppid(), SIGTERM);
}
}
int main() {
signal(SIGINT, sig_handler);
signal(SIGQUIT, sig_handler);
signal(SIGUSR1, sig_handler);
printf("Conductor is on duty...\n");
pause();
printf("Conductor is off duty...\n");
return 0;
}
```
在终端中编译并运行:
```
$ gcc driver.c -o driver
$ gcc conductor.c -o conductor
```
打开两个终端窗口,分别进入相应的目录。
在第一个窗口中执行:
```
$ ./driver
```
在第二个窗口中执行:
```
$ ./conductor
```
在第二个窗口中按下 Ctrl-C(SIGINT) 就会使得第一个窗口输出 "Let's gogogo!"。在第二个窗口中按下 Ctrl-\(SIGQUIT)就会使得第一个窗口输出 "Stop the bus!"。在第一个窗口中按下 Ctrl-Z(SIGTSTP)就会使得第二个窗口输出 "Please get off the bus!"。
阅读全文