2014-11-20 66 views
-3

我想捕获其句柄中的信号。所以我为一个信号定义了自定义处理程序。使用结构,我也设置了SA_NODEFER,以允许在其处理程序中接收信号。但我不知道检查这个的最好方法是什么。首先,我分叉子进程并在其中设置信号处理程序。然后我从父进程发送信号,但我不知道如何显示这个信息,例如使用printf。在hanlder内部应该做些什么来捕捉信号。 我会很感激任何帮助。谢谢。在其处理程序中捕获信号的最佳方法

编辑

我需要捕捉其处理程序中的信号。例如我已经创建这样处理函数

void signal12_handler(int sig) { 
    printf("Signal has been received\n"); 
    // I need to do here some long time operations 
} 

从父进程,我发送信号之后和接收第一信号它开始在处理程序执行时间长的操作,但不等待执行此操作的结束后的我发送相同的信号进行处理,我需要得到通知。

我不知道什么是正确的方式来做到这一点。

编辑2

int main() 
{ 
    pid_t pid; 
    printf("Starting...\n"); 
    pid = fork(); 
    if (pid == -1) 
    { 
     printf("error\n"); 
     return 1; 
    } 
    if (pid == 0) 
    { 

     printf("Child creation...\n"); 
     memset (&sig_12, '\0', sizeof(sig_12)); 
     sig_12.sa_handler = &signal12_handler; 
     sig_12.sa_flags = SA_NODEFER; 
    if (sigaction(SIGUSR2, &sig_12, NULL) < 0) { 
     perror ("sigaction"); 
    return 1; 
    } 

     while(true) {}; 

     printf("Child end ...\n"); 
    } 
    else 
    { 
      printf("i`m parеnt, id=%d\n",getpid()); 
      printf("send SIGNAL 12\n"); 
      if (kill(pid,12)<0){printf("ERROR!\n");} 
      sleep(1); 
      if (kill(pid,12)<0){printf("ERROR!\n");} 
      sleep(1); 
      if (kill(pid,12)<0){printf("ERROR!\n");} 


    } 


} 

所以处理程序应该花费很多时间比在我的情况下,从父发送信号应大于2秒(2睡第二)的时间间隔。

+0

请阅读编辑 – bryzzeij 2014-11-20 21:13:10

+0

对不起,我忘了点击保存按钮 – bryzzeij 2014-11-20 21:25:09

+1

请再看一遍,我添加了代码。 – bryzzeij 2014-11-20 21:41:49

回答

0

从我们在评论中的讨论中,我想我有一个可能的解释你的问题。

您正在使用SA_NODEFER标志来建立可重入信号处理程序。当然,当处理程序没有什么比打印更快时,并且实际上比重入定时器更快时,一切都很顺利。

但是,当您开始在处理程序中进行实际工作时,重入不能很好地工作。

这是因为只有少数实际上reentrant库函数(线程安全的,which is a different thing)。在大多数平台上,printf()malloc()本身(很可能涉及您的长时间运行任务)are not reentrant

这意味着一旦开始了长时间运行的任务,第二个可重入信号会中断第一个处理程序,再次运行它,并通过非重入printf()调用进行。因此,即使在第二次长时间运行之前,程序的行为也未定义。

可重入信号处理程序非常棘手,可能对您的问题而言太低级别的工具。如果你想要并行性,考虑多处理和/或多线程。

+0

感谢您的解释! – bryzzeij 2014-11-20 22:46:17

相关问题