当我捕获任何信号时,我想发送消息'结束'对于孩子的过程,如果他们仍然活着使用杀死pid来杀死它。没有全局变量
我想我必须使用sa_sigaction,但是我混淆了如何发送管道的FILE *和子的pid。有人可以为此举个例子吗?
我想将pip和pid传递给hdl如何更改我的代码? 我想捕获所有可捕获的信号,第一个参数是什么 sigaction(SIGINT,& act,pip)??而不仅仅是SIGINT 提前致谢
static void hdl (int sig, siginfo_t *siginfo, void *pip)
{
xxxxxxx
}
int main() {
FILE** pip;
int* pid;
struct sigaction act;
memset (&act, '\0', sizeof(act));
act.sa_sigaction = &hdl;
act.sa_flags = SA_SIGINFO;
sigaction(SIGINT, &act, pip);
sleep (10);
return 0;
}
答案 0 :(得分:3)
这只是不可能(将更多参数传递给信号处理程序)。您需要使用一些全局变量或静态变量。
您无法向信号处理程序添加任何参数,即使只是pid_t
或FILE*
或某些void*
信号由内核提供,它是内核(在libc
中的某些低级,机器和ABI特定的trampoline代码中提供一些帮助)信号处理程序的框架(以及sigreturn(2))的框架。因此,处理程序的签名是固定的,如signal(7)
此外,您有少量信号。因此,您可以考虑使用包含与信号相关的数据数组的全局变量。
使用sigaction(2)(使用SA_SIGINFO
),您会获得一个int
信号编号,siginfo_t
和ucontext_t
指向您的处理程序的指针。你可以适当地使用它们。例如,对于SIGIO
,您可以使用si_fd
来获取导致该信号的文件描述符。
请注意信号处理程序只允许调用(甚至间接)一个非常小的函数集(所谓的 async-signal-safe 函数,通常是syscalls的子集。特别是调用fputs
或任何<stdio.h>
函数;或者malloc
禁止在信号处理程序中。因此,即使通过一些全局变量,也不应该在信号处理程序中使用任何FILE*
(即undefined behavior,即使它有时显然可以正常工作)。
一个常见的习惯(参见关于signal.h的POSIX文档)是仅在信号处理程序中设置一些全局volatile sig_atomic_t
标志,并测试(并重置)该标志外部处理程序。然后,您通常可以使用poll(2) - 或fileno(3)(在之外的信号处理程序,例如在主要内部的某个循环中)调用waitpid(2)码)。
您需要在Advanced Linux Programming和高级Posix编程上阅读图书