0

我曾尝试在 ubuntu 中编写信号处理函数。代码如下:

   #include<signal.h>
   void abc();

   main(){

   printf("Press Ctrl-z key to send SIGINT signal");
   signal(SIGINT,abc);
   for(;;);
   }
   void abc(){
   printf("The key has been pressed");
   }

有趣的因素是: a) 第一个 printf() 未显示 b) 以及第二个 printf();

我从一本书中编写了代码。谁能告诉我我犯了什么错误,或者代码是否会针对ubuntu进行更改。

提前谢谢。

4

1 回答 1

0

stdout是行缓冲的。

您可能希望将 a 附加\n到传递给的字符串printf()

printf("The key has been pressed.\n");

如果Crtl-C按下SIGINT则发送到在前台运行的进程。SIGINT结束应用程序的默认处理程序。

由于 OP 的应用程序安装了一个SIGINT不会结束应用程序的信号处理程序,因此如果Ctrl-C按下它并因此SIGINT引发 a ,它将继续运行。Ctl-C只要它保持安装状态,它就会被调用。

要实现abc()只调用一次的行为,请修改信号处理程序,如下所示:

void abc(int sig) /* 'sig' gets the signal nuber passed in (here: 'SIGINT') */
{
  printf("The key has been pressed.\n");
  signal(sig, SIG_DFT); /* (re-)sets the signal handler for `sig` to the default handler. */
}

进一步阅读:man signalman sigaction

于 2013-02-04T18:47:08.710 回答