c SIGINT起作用了吗?

时间:2014-11-27 00:26:08

标签: c unix signals

我正在尝试使用SIGINT。我基本上希望我的程序在用户点击control-c时立即启动。当发生这种情况时,我会让程序制作一个管道。

现在,我决定在信号处理程序中按下control-c时,它将调用一个函数来创建管道。然而这很糟糕。运行printf命令很好,但在再次按control-c之前拒绝执行if语句。有人能帮忙吗?

实际上,我想在按下一次后禁用control-C。

#include <stdio.h>
#include <signal.h>

void catchme(int signal);
void Setup();


int main()
{
  if (signal(SIGINT, catchme) == SIG_ERR)
  {
    write(2, "Error catching signal C\n", 26);
  } 

  printf("To begin, please press CTRL + C\n");
  for(;;);
  return 0;
}

void catchme(int signal)
{
  write(1, "\n Caught Signal from Control C\n", 33);
  Setup();
}

void Setup()
{
  int firstPipe[2];

  printf("Lets set up...\n");

  if (pipe(firstPipe) < 0)
  {
    printf("Error creating pipe 1\n");
    //abort program
  }
  else
  {
    printf("working so far");
  }
}

1 个答案:

答案 0 :(得分:0)

你应该让调试器工作。它会在几秒钟内为您提供问题的答案,并且对于尝试追踪这些问题至关重要。当你试图解释输出时,看起来非常神秘和不清楚的东西,当你踩过它时看起来很容易,你可以看到一切。

这可能导致pipe()没有按照你的预期行事,你会检查errno,并且可能会得到一个有用的答案。

评论者关于避免在信号处理程序中做事情的建议很好,因为它不便携。但是,大多数现代操作系统都非常宽松,所以我不确定在这种情况下这是不是你的问题。