试图让SIGACTION与控件C一起使用但不起作用?

时间:2017-05-26 01:33:42

标签: c

所以,基本上,我希望我的程序所做的就是让我的程序在控件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...

0 个答案:

没有答案