簡體   English   中英

無法在 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”命令似乎沒有做任何事情。 如果我嘗試做其他事情而不是“cat”,比如“echo something”,它工作正常,所以我相信問題出在“cat”而不是 system() 函數上。 文件“output.txt”位於 C 程序的同一目錄中,如果我嘗試通過另一個 C 腳本對該文件執行 cat ,它會起作用。 此外,如果我嘗試從 shell 執行該命令,它會起作用。

我已經檢查了system("cat output.txt")的返回值system("cat output.txt") ,結果為 0。那么問題出在哪里呢?

編輯:文件 output.txt 也作為 FILE 流(使用fopen() )在程序中由另一個線程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);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM