如何将两个参数传递给sa_sigaction?它们是FILE *和子进程的PID

时间:2015-09-30 04:32:10

标签: c linux

当我捕获任何信号时,我想发送消息'结束'对于孩子的过程,如果他们仍然活着使用杀死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;
}

1 个答案:

答案 0 :(得分:3)

这只是不可能(将更多参数传递给信号处理程序)。您需要使用一些全局变量或静态变量。

您无法向信号处理程序添加任何参数,即使只是pid_tFILE*或某些void*

这么简单

信号由内核提供,它是内核(在libc中的某些低级,机器和ABI特定的trampoline代码中提供一些帮助)信号处理程序的框架(以及sigreturn(2))的框架。因此,处理程序的签名是固定的,如signal(7)

中所述

此外,您有少量信号。因此,您可以考虑使用包含与信号相关的数据数组的全局变量。

使用sigaction(2)(使用SA_SIGINFO),您会获得一个int信号编号,siginfo_tucontext_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编程上阅读图书