无法在 C 中使用 system() 函数执行 "cat"

Can't execute "cat" using system() function in C

我的 C 程序中有一个函数是 SIGINT 信号的处理程序,执行时只需执行以下命令:

void sigint_handler(int sig)
  {
    system("cat output.txt");
    exit(0);
  }

问题是“cat”命令似乎没有任何作用。如果我尝试做其他事情而不是“猫”,比如“回声”,它工作正常,所以我相信问题出在“猫”而不是 system() 函数。 文件“output.txt”位于 C 程序的同一目录中,如果我尝试通过另一个 C 脚本对该文件执行 cat,它会起作用。另外,如果我尝试从 shell 执行该命令,它会起作用。

我已经检查了 system("cat output.txt") 中的 return,它是 0。那么问题是什么?

编辑:文件 output.txt 也在程序中作为 FILE 流(使用 fopen())由另一个线程打开,这可能是个问题吗?

您应该知道信号处理程序只能安全地调用一组受限的 async-signal-safe functionssystem()exit() 都不在列表中。调用它们很可能会触发未定义的行为,从而导致不可预知的结果。

:

I see, but I don't understand why his version is working while mine is not. I declare the signal handler in the same way, but my program can't execute that "cat" command, while in his version it does.

我秒:

Sometimes things that aren't guaranteed still work despite not being guaranteed as an accident of environment or configuration. That doesn't make the code that just happens to work correct; good code relies only on documented, guaranteed semantics.

一个常见的解决方法是将信号处理代码移至主程序,并让主程序定期检查 global variable。从信号处理程序中,所有要做的就是设置全局变量和 return。这种技术可以让您随心所欲,尽管方式有些复杂。

volatile sig_atomic_t sigint_received = 0;

void sigint_handler(int sig)
{  
  sigint_received = 1;
}
// main program loop
for (;;) {
  // do stuff
  ...

  // check for interruption
  if (sigint_received) {
    system("cat output.txt");
    ​exit(0);
  }
}