gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:38:43 26 4
gpt4 key购买 nike

当我捕获任何信号时,我想向子进程发送消息“end”,如果它们仍然存在,请使用kill 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;
}

最佳答案

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

您不能向信号处理程序添加任何参数,即使像 pid_t 这样简单也是如此。或FILE*或一些void*

信号由内核传递,并且是内核(在一些低级、机器和 ABI 特定的、 trampoline 类似 libc 中的代码的帮助下)推送信号的调用帧处理程序(也是 sigreturn(2)) 的一个。因此处理程序的签名是固定的,如 signal(7) 中所述

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

sigaction(2) (使用 SA_SIGINFO )你会得到 int信号编号,a siginfo_t和一个 ucontext_t指向你的处理程序的指针。您可以适本地使用它们。例如,对于 SIGIO您可以使用si_fd获取导致该信号的文件描述符。

请注意,信号处理程序只允许调用(甚至间接)非常小的函数集(所谓的>异步信号安全函数,通常是 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 编程

关于c - 如何将两个参数传递给 sa_sigaction?它们是子进程的FILE*和PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32857867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com