所以,基本上,我希望我的程序所做的就是让我的程序在控件C正在执行时停止运行(也就是杀死子进程),同时仍然运行主父进程。我试图用下面的sigaction做到这一点:
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 struct,将handler设置为handler并尝试在程序运行时命中CTRL-C时将该事件发送给处理程序。
然后,一旦它在处理程序中,它就会终止子进程,该进程将ID存储在pidKillTracker中。
但是,当我在程序中实际执行此操作时,我的程序会出现分段错误(核心转储)。
我似乎正在关注我查找的教程所要做的所有内容,但我不清楚发生了什么。我试图记住sa,因为我读到的地方可以防止这个问题,但它什么也没做。
即使我评论出“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...