0
#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);
}

我没有得到: Out... 在 ctrl+c 之后 所以永远不要返回 while 或离开。我该如何解决它,继续主,并打印“Out ...”?

4

4 回答 4

3

我不明白:Out... 在 ctrl+c 之后

因为信号处理程序立即结束进程,所以main永远没有机会实际执行 printf。我怀疑您实际上并不想exit在处理程序中。您应该pause退出循环并等待信号传递。

这不是等待信号的最佳方式。对于初学者来说,可以想象用户可以在您有机会发送 SIGINT 之前发送 SIGINT pause。信号将丢失并pause(2)阻塞直到时间结束。

您可能应该使用sigsuspend或更简单的sigpause.

于 2013-01-12T20:01:18.350 回答
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);
}
于 2013-01-12T20:13:43.557 回答
1

不要printf在 sigint_handler 中使用,它可能是未定义的行为。 可以在信号处理程序手册页中调用的安全函数列表
说明:使用可重入函数进行更安全的信号处理

于 2013-01-12T20:01:06.473 回答
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 相比,在信号处理程序中允许您执行的操作要严格得多。

于 2013-01-12T20:19:04.967 回答