Linux中C语言得signal函数如何传递参数
时间: 2023-12-10 20:40:24 浏览: 119
在Linux中,C语言的`signal()`函数用于注册信号处理函数。该函数原型为:
```c
void (*signal(int sig, void (*func)(int)))(int);
```
其中,第二个参数是一个指向函数的指针,该函数将在收到信号时被调用。该函数的参数是一个整数,表示信号编号。因此,如果需要向信号处理函数传递其他参数,可以通过以下方式实现:
1. 定义一个全局变量,在信号处理函数中使用该全局变量来传递参数。
```c
#include <stdio.h>
#include <signal.h>
int param;
void handler(int sig) {
printf("Received signal %d with parameter %d\n", sig, param);
}
int main() {
param = 123;
signal(SIGUSR1, handler);
// 发送 SIGUSR1 信号
kill(getpid(), SIGUSR1);
return 0;
}
```
2. 使用`sigaction()`函数替代`signal()`函数,这样可以在`sigaction()`函数的结构体中定义一个参数,该参数将在信号处理函数中被传递。
```c
#include <stdio.h>
#include <signal.h>
void handler(int sig, siginfo_t *si, void *unused) {
int param = si->si_value.sival_int;
printf("Received signal %d with parameter %d\n", sig, param);
}
int main() {
struct sigaction sa;
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
// 注册 SIGUSR1 信号处理函数
sigaction(SIGUSR1, &sa, NULL);
// 发送 SIGUSR1 信号,并传递参数
union sigval value;
value.sival_int = 123;
sigqueue(getpid(), SIGUSR1, value);
return 0;
}
```
阅读全文