#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void sigint_handler(int);
int main()
{
signal(SIGINT, sigint_handler);
while (1){
pause();
}
printf("Out..\n");
return 0;
}
void sigint_handler(int sig)
{
printf("killing process %d\n",getpid());
exit(0);
}
我没有得到:出来......在ctrl + c之后 所以永远不要回来或出去。我如何解决它,继续在主要,并打印“Out ...”?
答案 0 :(得分:2)
我没有得到:出来......在ctrl + c之后
因为信号处理程序会立即结束该过程,所以main
永远不会有机会实际执行printf。我怀疑你实际上并不想在处理程序中exit
。您应该将pause
取出循环并等待信号传递。
这不是等待信号的最佳方式。对于初学者来说,可以想象用户可以在有机会pause
之前发送SIGINT。信号将丢失,pause(2)
将阻塞,直到时间结束。
您应该使用sigsuspend
或更简单的sigpause
。
答案 1 :(得分:1)
不要在sigint_handler中使用printf
,它可能是未定义的行为。 The list of safe functions that can be call in signal handler man page。
说明:Use reentrant functions for safer signal handling
答案 2 :(得分:1)
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void sigint_handler(int);
int main()
{
signal(SIGINT, sigint_handler);
pause();
printf("Out..\n");
return 0;
}
void sigint_handler(int sig)
{
printf("killing process %d\n",getpid());
//exit(0);
}
答案 3 :(得分:0)
如果您希望main()
中的循环在控制下退出,则必须使其成为非无限循环。我可能会这样做:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static volatile sig_atomic_t sig_received = 0;
void sigint_handler(int);
int main(void)
{
signal(SIGINT, sigint_handler);
while (sig_received == 0)
pause();
printf("Out..\n");
return 0;
}
void sigint_handler(int sig)
{
sig_received = sig;
}
这符合C标准的要求,对于信号处理程序允许的操作比POSIX要严格得多。