请编写C语言程序,使用 sigaction 系统调用来更改当前进程处理信号的方式。注意,shell 进程本身可能需要忽略一些信号,但 shell 的子进程仍应以默认操作响应。例如,shell 可以选择忽略 SIGTTOU,但子进程不应该。
时间: 2023-06-02 18:07:46 浏览: 42
好的,下面是 C 语言程序的代码:
```c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
void handler(int sig) {
printf("Received signal %d\n", sig);
}
int main() {
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
while (1) {
printf("Waiting for signal...\n");
sleep(1);
}
return 0;
}
```
此程序使用 `sigaction` 系统调用来更改当前进程处理 `SIGINT` 信号的方式,即注册了一个名为 `handler` 的信号处理函数来处理 `SIGINT` 信号。该程序可以在接收到 `SIGINT` 信号时打印一条消息,并继续等待其他信号的到来。注意,此程序中没有忽略任何信号,因此在子进程中也会默认处理所有信号。
相关问题
进程的信号掩码和sigaction里的掩码有什么区别
进程的信号掩码和sigaction里的掩码都是用于控制信号传递的,但它们的作用范围和使用方式略有不同。
进程的信号掩码是一个进程级别的全局变量,用于控制进程接收或屏蔽哪些信号。在Linux中,可以使用sigprocmask函数来获取或修改进程的信号掩码。进程的信号掩码在整个进程生命周期内都有效,包括在进程执行任何操作时都有效,而且是全局控制的。
sigaction结构体中的sa_mask字段则是针对每个信号处理程序的局部变量,用于控制在执行该信号处理程序时需要阻塞哪些信号。每个信号的sa_mask都可以单独设置,具有更细粒度的控制。在信号处理程序执行期间,该sa_mask字段会自动覆盖进程信号掩码,用于控制信号的传递。
另外,进程的信号掩码和sigaction里的掩码的作用对象也不同。进程的信号掩码控制的是整个进程所接收的信号,而sigaction里的掩码只控制在执行某个信号处理程序时需要阻塞哪些信号。因此,进程的信号掩码可以影响整个进程的运行,而sigaction里的掩码只影响当前的信号处理程序。
简述Linux进程对信号的处理方法
Linux进程对信号的处理方法包括以下几种:
1. 忽略信号:进程可以选择忽略某个信号,这意味着当该信号到达时,进程将不会做出任何响应。可以通过signal函数或sigaction函数来设置信号的处理方式为SIG_IGN。
2. 捕获信号:进程可以安装一个信号处理函数,当某个信号到达时,内核会自动调用该处理函数。可以通过signal函数或sigaction函数来设置信号的处理方式为自定义的处理函数。
3. 执行默认操作:对于大部分信号,Linux内核定义了默认的处理方式,例如终止进程、核心转储等。可以通过signal函数或sigaction函数来设置信号的处理方式为SIG_DFL。
4. 信号排队:当多个相同类型的信号到达时,内核会将这些信号排队,等待进程处理。可以通过sigaction函数中的SA_SIGINFO选项来开启信号排队功能。
5. 信号屏蔽:进程可以通过sigprocmask函数来设置信号屏蔽字,屏蔽某些信号的到达,避免在某些关键时刻被中断。可以通过sigprocmask函数来设置信号屏蔽字。
需要注意的是,对于一些不能被忽略的信号,例如SIGKILL、SIGSTOP等,进程不能修改其默认处理方式。