gpt4 book ai didi

c++ - 使用信号检测子进程何时终止的最佳方法是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:12 27 4
gpt4 key购买 nike

我有一个进程子进程(用 fork 创建),我想知道它在父进程中死去的地方,然后在那里做点什么。在句柄函数中我想使用成员类函数,所以我必须将指针传递给“this”。

我想过两种方式:

选项 1:

使用sigaction;

static RpcCmd* rpcCmdPtr = nullptr;// global pointer to save class  

主要是:

  rpcCmdPtr  = this;  
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = **sigchldHdl**;
sigaction(SIGCHLD, &act, 0)

/* SIGCHLD handler. */
void **sigchldHdl**(int sig)
{
if(rpcCmdPtr != nullptr)
{
rpcCmdPtr->sigHandler(sig);
}
}

void RpcCmd::sigHandler(int sig)
{ // here are some code...}

选项 2:

使用另一个线程,将指向“this”的指针作为参数传递,并在那里使用signalfd;

    static void * sigThread(void * arg)  
{
rpcCmd* rpcCmdPtr = static_cast<rpcCmd*>(arg)
sigprocmask(SIG_BLOCK, &mask, NULL)

/* Create a file descriptor from which we will read the signals. */
sfd = signalfd (-1, &mask, 0);

while (1) {
struct signalfd_siginfo si;
res = read (sfd, &si, sizeof(si));
if (si.ssi_signo == SIGCHLD)
// more code ...
}

我想知道什么是最好的方法,为什么

提前致谢。

最佳答案

仔细阅读signal(7)signal-safety(7) (请记住,大多数 C++ 标准库 - 包括 newcontainers 等... - 都是基于 异步信号安全函数,如 malloc,因此您通常不能从信号处理程序调用这些 C++ 函数)

您忘记了更便携的选项 3:

  • 在进程初始化时,创建一个 pipe(7) (对“ self ”过程)

  • 在输入您的 event loop 之前为该管道安装一个读取处理程序(它将是 read(2) 字节)

  • 为您的信号安装(使用 sigaction(2) )一个信号处理程序,它只是 write(2)一个或几个字节进入管道。请注意,write 异步信号安全的。

此方法由Qt 提出,参见其Calling Qt Functions From Unix Signal Handlers页面。

顺便说一句,许多事件循环库(通常高于 poll(2) ...)确实已经处理了 SIGCHLD

关于c++ - 使用信号检测子进程何时终止的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50673686/

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