试图让SIGACTION与控件C一起工作,但不工作?
所以,基本上,我想要我的程序做的就是让我的程序在控件C执行时停止它正在运行的任何操作(也就是杀死子进程),同时仍然运行主父进程。我正试图通过下面的操作来实现这一点:试图让SIGACTION与控件C一起工作,但不工作?,c,C,所以,基本上,我想要我的程序做的就是让我的程序在控件C执行时停止它正在运行的任何操作(也就是杀死子进程),同时仍然运行主父进程。我正试图通过下面的操作来实现这一点: void handler(int signum) { kill(pidKillTracker, SIGINT); if(signum== SIGINT) { printf("\nChild PID is terminated: %s\n", pidKillTracker);
void handler(int signum)
{
kill(pidKillTracker, SIGINT);
if(signum== SIGINT)
{
printf("\nChild PID is terminated: %s\n", pidKillTracker);
fflush(stdout);
}
}
int main(int argc, char ** argv)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler= handler;
//signal(SIGINT, SIG_IGN);
if(sigaction(SIGINT, &sa, NULL)==-1)
{
printf("SIGACTION");
fflush(stdout);
}
//REST OF CODE BELOW...
基本上,我正在创建名为sa的sigaction结构,将handler设置为handler,并尝试在程序运行时点击CTRL-C时将内容发送给handler
然后,一旦它进入处理程序,它就会终止子进程,该子进程的ID存储在pidKillTracker中
然而,当我在程序中实际执行此操作时,我的程序会出现分段错误(内核转储)
我似乎在按照我查阅的教程所说的去做,但我不清楚到底发生了什么。我试图将sa设置为memset,因为我在某个地方读到了可以防止此问题的内容,但它没有任何作用
即使我注释掉“kill(pidKillTracker,SIGINT)”,程序仍然会出现分段错误
下面是我在程序中调用sleep 5,然后按ctrl-c的示例。同样的问题也出现了:
-bash-4.1$ programrun
:sleep 5
^C
Segmentation fault (core dumped)
-bash-4.1$
我将感谢任何指导,因为我已经阅读了尽可能多的关于这一点,似乎在这一点上没有得到任何进展
编辑,以下是我在没有printf的情况下所做的操作,但仍然出现分段错误:
void handler(int signum)
{
//kill(pidKillTracker, SIGINT);
if(signum== SIGINT)
{
kill(pidKillTracker, SIGINT);
sigINTTracker=1;
}
}
int main(int argc, char ** argv)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler= handler;
//signal(SIGINT, SIG_IGN);
if(sigaction(SIGINT, &sa, NULL)==-1)
{
printf("SIGACTION");
fflush(stdout);
}
//REST OF CODE BELOW...
您不应该在信号处理程序中调用
printf()
。只能调用记录为异步信号安全的函数。请尝试在下运行。有一种可能是您正在读/写不应该读/写的内存,如果是这样,这个工具会告诉您。因此,我删除了printf(),但是如果内存中有任何内容,它基本上会出错。如果它是空的,它将运行。是的,一般来说,你只需要设置一个标记就可以生成一个MCVE(),在你的机器上重现你的问题。我们真的无法猜测你在代码中做了什么我们看不到这可能是导致崩溃的原因。