a) 编制一段程序,使其实现进程的软中断通信。 b) 在上面的程序中增加语句signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。
时间: 2024-10-11 16:16:29 浏览: 10
a) 要编写一个简单的进程间软中断通信程序,我们可以利用Unix/Linux系统提供的信号处理机制。这里我会给出一个基于C语言的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
// 定义一个接收信号并打印信息的函数
void handle_signal(int signum) {
switch (signum) {
case SIGUSR1:
printf("Received signal USR1 from parent process.\n");
break;
default:
printf("Unexpected signal %d received.\n", signum);
}
}
int main() {
// 创建子进程
pid_t child_pid = fork();
if (child_pid == 0) { // 子进程
// 注册信号处理器
signal(SIGUSR1, handle_signal);
// 进入死循环等待外部中断
while (1) {
sleep(1); // 每秒检查一次信号
}
} else { // 父进程
// 发送信号给子进程
kill(child_pid, SIGUSR1);
// 等待子进程结束
wait(NULL);
// 修改信号处理策略,忽略后续的SIGINT和SIGQUIT
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
// 再次发送信号,这将被忽略
kill(child_pid, SIGINT); // 或者 kill(child_pid, SIGQUIT);
kill(child_pid, SIGUSR1); // 只有SIGUSR1会被处理
}
return 0;
}
```
b) 当你在父进程中设置了`signal(SIGINT, SIG_IGN)`和`signal(SIGQUIT, SIG_IGN)`之后,当你按下Ctrl+C或者按Q退出程序时,由于我们已经忽略了这两个信号(SIGINT代表Ctrl+C,SIGQUIT代表强制退出),所以子进程不会收到这些信号,也不会有任何反应。只有当父进程向子进程发送SIGUSR1信号时,子进程才会响应。