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

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

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

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

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

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

回答

您应该知道信号处理程序只能安全地调用一组受限的异步信号安全函数。既不在名单上,system()也不exit()在名单上。调用它们可能会触发未定义的行为,从而导致不可预测的结果。

你说:

我明白了,但我不明白为什么他的版本有效而​​我的版本无效。我以相同的方式声明信号处理程序,但我的程序无法执行“cat”命令,而在他的版本中却可以。

我支持Charles Duffy 的回复:

有时,尽管不能保证是环境或配置的意外,但不能保证的事情仍然有效。这不会使刚好工作的代码正确;好的代码只依赖于文档化的、有保证的语义。

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

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


以上是无法在C中使用system()函数执行“cat”的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>