首页 > 解决方案 > 无法在 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 也作为文件流(使用fopen())在程序中由另一个线程打开,这可能是一个问题吗?

标签: cbashposixsystemcat

解决方案


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

你说

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

同意查尔斯达菲的回复

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

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

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

推荐阅读