gpt4 book ai didi

c - 为什么线程函数不调用? (SIGEV_THREAD)

转载 作者:太空狗 更新时间:2023-10-29 12:21:29 24 4
gpt4 key购买 nike

我有一个调用信号 sigkill(getpid(), SIGUSR1) 的程序。我希望当信号到来时,应该调用线程函数而不是信号处理程序,或者两者都调用。为此,我在 sigev_notify 中填充了 SIGEV_THREAD

但不幸的是,线程函数没有被调用。为什么会这样?

下面是代码:

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <string.h>

static void ThreadhandlerTimer1(int);
void sig_handlerTimer1(int);

static void threadFunction(union sigval sv) // Should be invoked on receipt of signal "SIGEV_THREAD"
{
printf("Thread function invoked");
}

int main()
{
int i;
static struct sigaction sa;
static struct sigevent sevp;

memset (&sevp, 0, sizeof (struct sigevent));
sevp.sigev_value.sival_ptr = NULL;
sevp.sigev_notify = SIGEV_THREAD;
sevp.sigev_notify_attributes = NULL;
sevp.sigev_signo = SIGUSR1;
sevp.sigev_notify_function=threadFunction;

/* Setting the signal handlers */

sa.sa_handler = sig_handlerTimer1;
sa.sa_flags = 0;
sigaction(SIGUSR1, &sa, NULL);

for(i=0; i<10; i++)
{
if((i==3) || (i==6)){
kill(getpid(), SIGUSR1);
}

printf("%d\n",i);
sleep(1);
}
}

void sig_handlerTimer1(int signum)
{
printf("Caught signal: %d\n",signum);
}

最佳答案

根据 this documentationsigevent 结构仅受“一些信号生成函数的支持,例如高分辨率计时器到期、异步 I/O 完成、进程间消息到达和 sigqueue() 函数。”

我不知道您对这段代码的真正计划是什么(也许您可以告诉我们),但事实上,您直接发出信号,这可能不是使用 SIGEV 的受支持情况之一。如果此代码非常接近您在生产中想要的代码,您可以简单地调用 sigqueue()而不是 kill(),它可能会起作用。

关于c - 为什么线程函数不调用? (SIGEV_THREAD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5744376/

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