我有一个 C++ 程序,它使用信号处理多个信号以执行不同的操作:
signal(SIGHUP, signal_handler);
我想扩展此信号处理,以允许我向程序发送不同的操作请求,并发现使用 sigaction 我将能够随信号一起接收额外的信息:
sigaction(SIGUSR1, &act, 0);
据我所知,我能够从其他程序发送这种类型的信号,在 sigval 对象上设置额外的信息,以便我知道在接收端,程序被要求做什么。
我想知道的是如何通过 bash 上的 shell 脚本发送这种类型的信号信息。是否可以?我可以使用 向我的程序发送信号kill -S SIGHUP [PID]
,但我找不到使用 发送额外参数的方法kill
,所以我想知道 bash 是否有任何模拟 sigaction / sigqueue 行为的命令,允许我向我的应用程序发送信号而无需开发另一个应用程序来完成这项工作。
答案1
这有效。首先,设置SA_SIGINFO
为.sa_flags
表示对额外信息感兴趣:
#include <signal.h>
#include <unistd.h>
void act(int s, siginfo_t *i, void *v)
{
//printing from here is unsafe but this is for testing
//purposes only
printf("pid=%d val=%d\n", i->si_pid, i->si_value.sival_int);
}
int main(int argc, char **argv)
{
struct sigaction sa = {
.sa_sigaction=act ,
.sa_flags = SA_RESTART|SA_SIGINFO
} ;
sigaction(SIGUSR1, &sa, NULL);
printf("%d\n", (int)getpid());
for(;;){
pause();
}
}
其次,创建您自己的kill(er)应用程序,能够发送此类额外信息:
#include <signal.h>
#include <unistd.h>
int main(int argc, char**argv)
{
union sigval val = { .sival_int = atoi(argv[2]) };
sigqueue((pid_t)atoi(argv[1]), SIGUSR1, val);
}
您可以尝试编译这两个可执行文件,并且您应该能够使用第二个可执行文件将整数发送到第一个可执行文件(./second pid int
)。
联机帮助页应该为您提供有关如何在此基础上进行构建的更多信息。
答案2
您的信息似乎已过时。从我的sigaction
手册页:
无证。 在引入 SA_SIGINFO 之前,还可以获得一些附加信息,即通过使用带有 struct sigcontext 类型的第二个参数的 sa_handler。这种用法现在已经过时了。
答案3
可以使用sigqueue()
和si_value
in发送和接收额外的参数siginfo_t
。中的“这种用法现在已过时”sigaction()
可能是指使用sa_handler
带有两个参数的 ,其中第二个参数是sigcontext
。引入 后SA_SIGINFO
,无需使用此类未记录的处理程序,因为所有处理程序都采用siginfo_t
具有该si_value
字段的参数。
但是,我不知道如何使用来自 shell 的有效负载对信号进行排队,您可能需要为此编写一个小型 C 程序。
答案4
现在可以使用 procps-ng 的更新版本的kill 来实现这一点:
kill -q <value> -<signal> <pid>