我應該把以下命令放在C程序的系統函數參數中。程序的輸出重定向問題
$ timed-run 20 prog1 1 1>/dev/null 2>abc.dat
timed-run
應該執行prog1
長達20秒,然後終止它。我希望prog1
的輸出重定向到abc.dat
。有沒有解決方案?
由於
我應該把以下命令放在C程序的系統函數參數中。程序的輸出重定向問題
$ timed-run 20 prog1 1 1>/dev/null 2>abc.dat
timed-run
應該執行prog1
長達20秒,然後終止它。我希望prog1
的輸出重定向到abc.dat
。有沒有解決方案?
由於
當寫「1>的/ dev /空」,要重定向程序的給比特桶的輸出。 (也就是說,你放棄它。)如果你寫「1>文件名」,輸出將轉到指定的文件。
所需輸出實際上是通過stderr而不是stdout生成的。所以,我必須使用2> abc.dat而不是1> abc.dat – 2011-03-24 20:29:26
那麼你的問題究竟是什麼?請注意,您寫入它的方式,abc.dat將包含對stderr的任何定時運行寫入。可能定時運行的程序不能正確處理prog1的IO流。 – 2011-03-24 21:17:18
對於重定向子進程輸出有幾種方法,下面2是最importants:
好的。讓我試試,我會就此更新你。 – 2011-03-24 20:22:44
我懷疑,但不知道沒有看到prog1
源代碼,即prog1
不刷新其輸出緩衝區。也就是說,它具有如下所示的代碼:
i = 42;
fprintf(stderr, "result: %d\n", i);
格式化的輸出(即「結果:42 \ n」個)被存儲在stderr
的輸出緩衝器等待時機被寫入。但是,在此之前,timed-run
用信號殺死prog1
。
您的選擇是定期撥打fflush(stderr)
,更改緩衝類型(使用setbuf
或setvbuf
),或在程序終止時捕獲信號並呼叫fflush(stderr)
。
+1使用42,+10如果你有一位名叫道格拉斯的兄弟。 – SuperJames 2011-03-24 21:39:09
1是stdout,2是stderr:'定時運行20 prog1 2>/dev/null 1> abc.dat'。我沒有得到你的問題 - 什麼不工作?你需要編寫程序'定時運行'嗎? – 2011-03-24 19:52:54
那麼,定時運行的腳本已經由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
那麼當你嘗試它時,這不起作用呢? – aschepler 2011-03-24 20:13:22