c语言中信号处理函数的签名
我使用开放信号SIGUSR1和SIGUSR2来调用用户定义的函数。我尝试了两个函数原型来实现我的信号处理功能。这两个都运行时没有任何编译错误。打开信号调用函数时,会发生什么情况?该功能应该如何实现 原型1: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
/***********************************************************/
/*** 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语言,尝试捕捉信号是徒劳的。先在谷歌上搜索并阅读一些教科书。