我有一个程序,我调用一个信号sigkill(getpid(), SIGUSR1)
。我希望信号来的时候,而不是信号处理程序的线程函数应该被调用,或两者。 为此我填入了sigev_notify
和SIGEV_THREAD
。为什么线程函数不能调用? (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);
}
它怎么会工作?你没有把任何东西传递给sevp。 – 2011-04-21 14:00:18
另外,一般而言,混合线程和信号是一个非常糟糕的想法。 – 2011-04-21 14:00:58
@Sami:您的意见“混合线程和信号非常糟糕”表明您可能从未使用过POSIX计时器。 – kingsmasher1 2011-04-22 15:13:40