C - linux 中的进程处理任何信号
C - Processes in linux handle with any signal
我正在编写代码,其中包含必须处理我给他的任何信号的进程。我读到我应该做那样的事情
void signalHandler(int sig_num)
{
// some stuff
}
//My process
int i;
for (i = 1; i <= 64; i++)
signal(i, signalHandler);
这是正确的解决方案吗??
如果您想使用相同的信号处理程序处理信号 1 到 64,那么您就走在了正确的轨道上。该测试程序将通过打印信号编号来处理信号 1 到 64。
#include <stdio.h>
#include <signal.h>
void signalHandler(int sig_num)
{
printf("Signal %d caught!\n", sig_num);
}
int main(int argc, char const *argv[])
{
//My process
int i;
for (i = 1; i <= 64; i++) {
signal(i, signalHandler);
}
while (1);
return 0;
}
例如,当您按 CTRL+C 时此程序是 运行。内核向程序发送信号2SIGINT
,并调用signalHandler(2)
。该程序打印 "Signal 2 caught!"
Post-Facepalm 编辑:这个程序显然需要用 kill -9
命令终止......
尽管@Dylan 的解决方案看起来不错而且确实如此,但它带来了一个常见问题,即与 signal
函数的兼容性问题。因此建议您始终使用 sigaction
。这是一个例子
#include <stdio.h>
#include <signal.h>
static void handler(int signo){
write(stdout, &signo, sizeof(int));
}
int main() {
struct sigaction sa;
sa.sa_handler = handler;
int i;
for (i = 1; i <= 64; i++) {
sigaction(i, &sa, NULL);
}
while(1);
return 0;
}
- 尽量避免使用
signal
- 切勿在信号处理程序中使用任何不是 Reentrant 或 Async-signal-safe 函数的函数,例如
printf
检查来自 here
的信号处理程序中允许的函数列表
POSIX.1-2004 (also known as POSIX.1-2001 Technical Corrigendum 2)
requires an implementation to guarantee that the following functions
can be safely called inside a signal handler:
我正在编写代码,其中包含必须处理我给他的任何信号的进程。我读到我应该做那样的事情
void signalHandler(int sig_num)
{
// some stuff
}
//My process
int i;
for (i = 1; i <= 64; i++)
signal(i, signalHandler);
这是正确的解决方案吗??
如果您想使用相同的信号处理程序处理信号 1 到 64,那么您就走在了正确的轨道上。该测试程序将通过打印信号编号来处理信号 1 到 64。
#include <stdio.h>
#include <signal.h>
void signalHandler(int sig_num)
{
printf("Signal %d caught!\n", sig_num);
}
int main(int argc, char const *argv[])
{
//My process
int i;
for (i = 1; i <= 64; i++) {
signal(i, signalHandler);
}
while (1);
return 0;
}
例如,当您按 CTRL+C 时此程序是 运行。内核向程序发送信号2SIGINT
,并调用signalHandler(2)
。该程序打印 "Signal 2 caught!"
Post-Facepalm 编辑:这个程序显然需要用 kill -9
命令终止......
尽管@Dylan 的解决方案看起来不错而且确实如此,但它带来了一个常见问题,即与 signal
函数的兼容性问题。因此建议您始终使用 sigaction
。这是一个例子
#include <stdio.h>
#include <signal.h>
static void handler(int signo){
write(stdout, &signo, sizeof(int));
}
int main() {
struct sigaction sa;
sa.sa_handler = handler;
int i;
for (i = 1; i <= 64; i++) {
sigaction(i, &sa, NULL);
}
while(1);
return 0;
}
- 尽量避免使用
signal
- 切勿在信号处理程序中使用任何不是 Reentrant 或 Async-signal-safe 函数的函数,例如
printf
检查来自 here
的信号处理程序中允许的函数列表POSIX.1-2004 (also known as POSIX.1-2001 Technical Corrigendum 2) requires an implementation to guarantee that the following functions can be safely called inside a signal handler: