gpt4 book ai didi

linux - 新创建线程的信号挂起列表不为空?

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

pthread_create 的手册页中,它说:“新线程的待处理信号集为空”。但是我写了一些代码进行测试,得到了相反的结果,新创建线程的信号挂起列表不为空。代码如下:

void* thread_fun(void* arg)
{
int s;
sigset_t pendingset;

s = sigemptyset(&pendingset);
if(s != 0)
{
printf("sigempty error.\n");
}
else{
s = sigpending(&pendingset);
if(s == 0){
if(sigismember(&pendingset, SIGINT))
printf("SIGINT in pending signal list.\n"); // this msg is printed
}
}

return NULL;
}

int main()
{
pthread_t tid;
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT);
pthread_sigmask(SIG_BLOCK, &set, NULL);

sleep(10); // send SIGINT to the process using kill -SIGINT pid
printf("before create thread...\n");
pthread_create(&tid, NULL, thread_fun, NULL);

pthread_join(tid, NULL);

return 0;
}

在 sleep 期间,我向进程发送了 SIGINT。因为 sigmask 集包括 SIGINT,此时接收到的 SIGINT 信号在信号列表中处于待处理状态。 pthread_create之后,在新线程中,sigpending返回调用线程的pending signals,SIGINT包含在set中。所以它与手册页不一致。

感谢任何帮助。

最佳答案

我认为问题在于您发送的信号是进程级信号,因此它对整个进程(以及所有阻塞它的线程)都处于挂起状态,无论它是否在创建线程之前处于挂起状态。 docs for sigpending()说(强调):

The sigpending() function shall store, in the location referenced by the set argument, the set of signals that are blocked from delivery to the calling thread and that are pending on the process or the calling thread.

如果调用 pthread_create() 时挂起的信号是线程级信号,那么它不会在新创建的线程上挂起。您可以使用 pthread_kill(pthread_self(), SIGINT) 函数发送信号来对此进行测试。

我同意关于为新线程清除未决信号的措辞对此不是很清楚。

关于linux - 新创建线程的信号挂起列表不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8643340/

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