2011-03-24 74 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