2011-03-24 77 views
0

我應該把以下命令放在C程序的系統函數參數中。程序的輸出重定向問題

$ timed-run 20 prog1 1 1>/dev/null 2>abc.dat 

timed-run應該執行prog1長達20秒,然後終止它。我希望prog1的輸出重定向到abc.dat。有沒有解決方案?

由於

+0

1是stdout,2是stderr:'定時運行20 prog1 2>/dev/null 1> abc.dat'。我沒有得到你的問題 - 什麼不工作?你需要編寫程序'定時運行'嗎? – 2011-03-24 19:52:54

+0

那麼,定時運行的腳本已經由linux中的expect包提供。我想放棄stdout的輸出,但希望將stderr的輸出(即2)重定向到abc.dat。事實上,prog1也有一個參數,例如$ timed-run 20 prog1 1 2> abc.dat 1>/dev/null – 2011-03-24 20:08:02

+0

那麼當你嘗試它時,這不起作用呢? – aschepler 2011-03-24 20:13:22

回答

1

當寫「1>的/ dev /空」,要重定向程序的給比特桶的輸出。 (也就是說,你放棄它。)如果你寫「1>文件名」,輸出將轉到指定的文件。

+0

所需輸出實際上是通過stderr而不是stdout生成的。所以,我必須使用2> abc.dat而不是1> abc.dat – 2011-03-24 20:29:26

+0

那麼你的問題究竟是什麼?請注意,您寫入它的方式,abc.dat將包含對stderr的任何定時運行寫入。可能定時運行的程序不能正確處理prog1的IO流。 – 2011-03-24 21:17:18

1

對於重定向子進程輸出有幾種方法,下面2是最importants:

  1. POPEN()(最簡單的一個理解和使用,但POPEN只有孩子的標準輸出工作,但你可以通過附加到命令行字符串「2> & 1」)
  2. 管叉和exec三人將幫助您重定向錯誤輸出到標準輸出,以及(有很多信息有關Internet這個功能)
+0

好的。讓我試試,我會就此更新你。 – 2011-03-24 20:22:44

1

我懷疑,但不知道沒有看到prog1源代碼,即prog1不刷新其輸出緩衝區。也就是說,它具有如下所示的代碼:

i = 42; 
fprintf(stderr, "result: %d\n", i); 

格式化的輸出(即「結果:42 \ n」個)被存儲在stderr的輸出緩衝器等待時機被寫入。但是,在此之前,timed-run用信號殺死prog1

您的選擇是定期撥打fflush(stderr),更改緩衝類型(使用setbufsetvbuf),或在程序終止時捕獲信號並呼叫fflush(stderr)

+0

+1使用42,+10如果你有一位名叫道格拉斯的兄弟。 – SuperJames 2011-03-24 21:39:09