信号使用后不能离开

时间:2013-01-12 19:59:35

标签: c while-loop signals

#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 ...”?

4 个答案:

答案 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要严格得多。