c语言中信号处理函数的签名

c语言中信号处理函数的签名,c,operating-system,signals,signal-handling,C,Operating System,Signals,Signal Handling,我使用开放信号SIGUSR1和SIGUSR2来调用用户定义的函数。我尝试了两个函数原型来实现我的信号处理功能。这两个都运行时没有任何编译错误。打开信号调用函数时,会发生什么情况?该功能应该如何实现 原型1: /***********************************************************/ /*** Sample program demonstrating the sending of signals ***/ /*** Written by Abhiji

我使用开放信号SIGUSR1和SIGUSR2来调用用户定义的函数。我尝试了两个函数原型来实现我的信号处理功能。这两个都运行时没有任何编译错误。打开信号调用函数时,会发生什么情况?该功能应该如何实现

原型1:

/***********************************************************/
/*** Sample program demonstrating the sending of signals ***/
/*** Written by Abhijit Das, 17-Jan-2014                 ***/
/***********************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

/* The signal handler for the child process */
void childSigHandler (int sig)
{
    //int sig;
   if (sig == SIGUSR1) {
      printf("+++ Child : Received signal SIGUSR1 from parent...\n");
      sleep(1);
   } else if (sig == SIGUSR2) {
      printf("+++ Child : Received signal SIGUSR2 from parent...\n");
      sleep(5);
   }
   exit(0);
}

int main ()
{
   int pid;

   pid = fork();                                   /* Spawn the child process */
   if (pid) {
                                                            /* Parent process */
      int t;
      srand((unsigned int)time(NULL));
      t = 2 + rand() % 4;
      printf("+++ Parent: Going to sleep for %d seconds\n", t);
      sleep(t);       /* Sleep for some time before sending a signal to child */
      t = 1 + rand() % 2;
      printf("+++ Parent: Going to send signal SIGUSR%d to child\n", t);
      kill(pid, (t == 1) ? SIGUSR1 : SIGUSR2);        /* Send signal to child */
      wait(NULL);                                   /* Wait for child to exit */
      printf("+++ Parent: Child exited\n");

   } else {
                                                             /* Child process */
      signal(SIGUSR1, childSigHandler);           /* Register SIGUSR1 handler */
      signal(SIGUSR2, childSigHandler);           /* Register SIGUSR2 handler */
      while (1) sleep(1);     /* Sleep until a signal is received from parent */

   }

   exit(0);
}
原型2:

/***********************************************************/
/*** Sample program demonstrating the sending of signals ***/
/*** Written by Abhijit Das, 17-Jan-2014                 ***/
/***********************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

/* The signal handler for the child process */
void childSigHandler ()
{
int sig;
   if (sig == SIGUSR1) {
      printf("+++ Child : Received signal SIGUSR1 from parent...\n");
      sleep(1);
   } else if (sig == SIGUSR2) {
      printf("+++ Child : Received signal SIGUSR2 from parent...\n");
      sleep(5);
   }
   exit(0);
}

int main ()
{
   int pid;

   pid = fork();                                   /* Spawn the child process */
   if (pid) {
                                                            /* Parent process */
      int t;
      srand((unsigned int)time(NULL));
      t = 2 + rand() % 4;
      printf("+++ Parent: Going to sleep for %d seconds\n", t);
      sleep(t);       /* Sleep for some time before sending a signal to child */
      t = 1 + rand() % 2;
      printf("+++ Parent: Going to send signal SIGUSR%d to child\n", t);
      kill(pid, (t == 1) ? SIGUSR1 : SIGUSR2);        /* Send signal to child */
      wait(NULL);                                   /* Wait for child to exit */
      printf("+++ Parent: Child exited\n");

   } else {
                                                             /* Child process */
      signal(SIGUSR1, childSigHandler);           /* Register SIGUSR1 handler */
      signal(SIGUSR2, childSigHandler);           /* Register SIGUSR2 handler */
      while (1) sleep(1);     /* Sleep until a signal is received from parent */

   }

   exit(0);
}

信号处理程序的签名为:

typedef void (*sighandler_t)(int);
您的第一个示例使用一个空参数列表,它基本上不声明任何预期参数。在这种情况下,编译器可能正在生成锅炉板来处理传递的任何参数

如果启用所有警告,则可能会从编译器中获得一些信息。还请注意,您可以将处理程序设置为静态,因为您无论如何都要将指针传递到库,它不必从外部可见。

阅读以下内容:

在这一页的前10行,你有你的答案。 因为我们这里的好朋友认为我不够明确,所以我将为您复制粘贴它们:

信号功能提供了一个简单的接口,用于为特定信号建立操作。函数和相关宏在头文件signal.h中声明

-数据类型:sighandler\u t

这是信号处理函数的类型。信号处理程序接受一个指定信号编号的整数参数,返回类型为void。因此,您应该像这样定义处理程序函数:

无效处理程序int符号{…}

此数据类型的名称sighandler\t是GNU扩展

 — Function: sighandler_t signal (int signum, sighandler_t action)
信号功能将动作建立为信号信号的动作。 有关定义信号处理程序函数的更多信息,请参阅定义处理程序

或者更好的是,谷歌:

signal handler function
或者更好的是,先读一本关于信号处理的教科书


如果您不熟悉C的基本机制,我认为现在处理信号处理还为时过早。

那么,当我们没有向信号处理程序传递任何参数时,为什么程序仍在执行?当我向函数传递3个整数时,它生成了一个警告。虽然没有什么在没有争论的情况下。这种行为是如何解释的?作为一个评论,这会更合适。@alk好吧,我本来也可以复制粘贴GNU文档,但它不会增加什么价值。关于OP正在努力解决的具体问题的简短摘要怎么样?这里的答案应该直接指向一个问题。@alk这正是GNU页面所做的。在前三行中,有一个sig处理程序原型的定义。那么为什么不引用这三行,添加一个介绍,将它们与OPs问题联系起来呢。然后用链接finsh你得到了报价表。在这两种情况下,它都应该是int-main-void。但是,如果你还没有掌握基本的C语言,尝试捕捉信号是徒劳的。先在谷歌上搜索并阅读一些教科书。