gpt4 book ai didi

c - sigwait() 和信号处理程序

转载 作者:IT王子 更新时间:2023-10-29 00:26:39 27 4
gpt4 key购买 nike

如果我为 SIGABRT 设置和发出信号处理程序,同时我有一个线程在 sigwait() 上等待 SIGABRT 到来(我在其他线程中有一个被 pthread_sigmask 阻塞的 SIGABRT)。

那么先处理哪一个呢?信号处理程序或 sigwait() ?

[我面临一些问题,sigwait() 永远被阻止。我目前正在调试它]

main()
{
sigset_t signal_set;

sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT);
sigprocmask(SIG_BLOCK, &signal_set, NULL);

// Dont deliver SIGABORT while running this thread and it's kids.
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);

pthread_create(&tAbortWaitThread, NULL, WaitForAbortThread, NULL);
..
Create all other threads
...
}

static void* WaitForAbortThread(void* v)
{
sigset_t signal_set;
int stat;
int sig;

sigfillset( &signal_set);
pthread_sigmask( SIG_BLOCK, &signal_set, NULL ); // Dont want any signals


sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT); // Add only SIGABRT

// This thread while executing , will handle the SIGABORT signal via signal handler.
pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL);
stat= sigwait( &signal_set, &sig ); // lets wait for signal handled in CatchAbort().
while (stat == -1)
{
stat= sigwait( &signal_set, &sig );
}

TellAllThreadsWeAreGoingDown();

sleep(10);

return null;
}

// Abort signal handler executed via sigaction().
static void CatchAbort(int i, siginfo_t* info, void* v)
{
sleep(20); // Dont return , hold on till the other threads are down.
}

在 sigwait() 处,我将知道已收到 SIGABRT。我会告诉其他线程。然后将持有中止信号处理程序,以便进程不会终止。

我想知道 sigwait() 和信号处理程序的交互。

最佳答案

来自 sigwait() 文档:

The sigwait() function suspends execution of the calling thread until one of the signals specified in the signal set becomes pending.

挂起信号是指等待传递给线程/进程之一的阻塞信号。因此,您需要不要像您对pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL) 调用那样解锁信号。

这应该有效:

static void* WaitForAbortThread(void* v){
sigset_t signal_set;

sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT);

sigwait( &signal_set, &sig );

TellAllThreadsWeAreGoingDown();

sleep(10);

return null;
}

关于c - sigwait() 和信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552600/

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