#include <stdio.h> #include <signal.h> #include <unistd.h> void conductor(int sig) { if (sig == 2) { kill(getppid(), SIGUSR1); } else if (sig == 3) { kill(getppid(), SIGUSR2); } else if (sig == SIGUSR1) { printf("please get off the bus!\n"); } else { printf("sig err\n"); } pause(); } void driver(int sig) { if (sig == SIGUSR1) { printf("let us gogogo!\n"); } else if (sig == SIGUSR2) { printf("stop the bus!\n"); } else if (sig == SIGTSTP) { kill(getppid(), SIGUSR1); } else { printf("sig err\n"); } pause(); } int main(int argc, char const *argv[]) { pid_t pid = fork(); if (pid < 0) { perror("fork err"); return -1; } else if (pid == 0) { signal(2, conductor); signal(3, conductor); signal(SIGUSR1, conductor); } else { signal(SIGUSR1, driver); signal(SIGUSR2, driver); signal(SIGTSTP, driver); } pause(); return 0; }
时间: 2024-02-14 14:23:27 浏览: 319
这是一个使用信号进行进程间通信的示例代码,其中包括两个进程,一个是司机进程,一个是售票员进程。售票员进程负责向司机进程发送信号控制公交车的行驶,司机进程负责根据收到的信号做出相应的行动。
具体来说,售票员进程可以通过发送 SIGUSR1 信号来让司机进程启动公交车,通过发送 SIGUSR2 信号来让司机进程停止公交车。而司机进程则可以通过接收到售票员进程发送的 SIGUSR1 信号来输出 "let us gogogo!",接收到售票员进程发送的 SIGUSR2 信号来输出 "stop the bus!",同时还可以通过接收到 SIGTSTP 信号来让售票员进程输出 "please get off the bus!"。
在程序中使用了 signal 函数来注册信号处理函数,其中售票员进程注册了 3 个信号处理函数,分别对应了 SIGUSR1、SIGUSR2 和 SIGUSR1 信号,而司机进程则注册了 3 个信号处理函数,分别对应了 SIGUSR1、SIGUSR2 和 SIGTSTP 信号。程序运行后,父进程和子进程都会在 pause 函数处阻塞等待信号的到来,直到收到信号后再根据相应的信号处理函数进行处理。
相关问题
用signal函数改写下面的程序,使闹钟时间到后输出“ling ling ling”,然后接着执行pause()后的语句。 提示:定时器时间到后向进程发出SIGALRM信号。 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { /* 调用alarm定时器函数 */ int ret = alarm(5); pause(); printf("I have been waken up.\n"); return 0; }
下面是使用signal函数改写后的程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void alarm_handler(int sig) {
printf("ling ling ling\n");
}
int main() {
// 注册SIGALRM信号处理函数
signal(SIGALRM, alarm_handler);
// 设置定时器
alarm(5);
// 暂停进程,等待信号到来
pause();
printf("I have been waken up.\n");
return 0;
}
```
程序中使用了signal函数注册了SIGALRM信号的处理函数alarm_handler,当定时器时间到达时,操作系统会向进程发送SIGALRM信号,进程就会执行alarm_handler函数来处理该信号。在alarm_handler函数中输出"ling ling ling",然后程序继续执行pause()后的语句。
阅读全文