gpt4 book ai didi

c - sigwait后如何执行语句

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:01 24 4
gpt4 key购买 nike

我正在尝试了解信号。我使用 sigwait 和 pthread_kill 编写了一小段代码。即使我使用 pthread_kill 发出了信号,sigwait 之后的语句也不会被执行。我得到的输出为“之前实时信号 0“预期输出:“前 之后”

#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>

void *fun(void *arg)
{
sigset_t set;
int signal;
sigemptyset(&set);
sigaddset(&set,SIGRTMIN);

printf("Before\n");
sigwait(&set,&signal);
printf("After\n");
}
int main()
{
pthread_t obj;
int ret = pthread_create(&obj,NULL,fun,NULL);
sleep(10);
pthread_kill(obj,SIGRTMIN);
return 0;
}

最佳答案

你的代码有两个问题:

1) SIGRTMIN 信号将在 sigwait() 能够将其出列之前彻底终止线程。如果你想让 sigwait 实际上返回,你应该为它安装一个信号处理程序:

void sigh(int s){}
void *fun(void *arg)
{
struct sigaction sa;
sa.sa_handler = sigh;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGRTMIN, &sa, 0);
...

2) 您可能在子线程退出之前从 main() 返回,这可能会在能够打印“After”之前再次杀死它。调用 pthread_join(obj, 0) 或至少在 pthread_kill 之后添加一个 sleep(1)

关于c - sigwait后如何执行语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58573131/

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