2010-10-29 133 views
8

我写了一个代码来获得一个运行时错误故意:关于标准输出/标准错误重定向

int main() 
{ 
int a=5; 
printf("Hello World\n"); 
printf("a=%s\n", a); 
} 

它提供:

$ ./error.o 
Hello World 
Segmentation Fault 
$ 

现在,记录运行时错误,我做的:

$ ./error.o > so.txt 
$ ./error.o &> soe.txt 

但这两个文件都是空的。为什么?

编辑:

实际上我正在编写的远程汇编和C程序的执行脚本。从我得到的答案Segmentation Fault不是程序的错误输出。那么,有没有办法来捕捉那个输出?此外,该程序只是一个示例,所以我不能添加这些语句。线路缓冲可以通过其他方式进行重定向吗?

+0

%s是错误的。 – Nyan 2010-10-29 09:11:45

+0

@Nyan:我这样做是故意得到seg-fault。我正在编写一个脚本来捕获执行错误,所以这只是模仿将来可能对我的脚本的输入。 – lalli 2010-10-29 09:24:47

+1

您编辑了关于如何为重定向文件启用行缓冲的问题。我更新了我的答案以添加信息。 – jjrv 2010-10-29 09:31:39

回答

10

so.txt是空的,因为标准输出没有得到崩溃,因此缓冲的内容丢失之前冲刷。如果添加:fflush(stdout);在printf命令之间,它将包含预期的文本。

您的soe.txt缺少“Segmentation Fault”消息,因为它是由shell打印的,而不是由您的程序打印的,因此不属于您的程序输出的重定向部分。

如果您不能修改代码,你可以通过欺骗程序认为它打印到一个TTY打开行缓冲。创建脚本error.sh:

#!/bin/sh 
./error.o 

然后做一个搭配chmod + X error.sh并调用它在Linux上:

script soe.txt -c ./error.sh 

或者这样的OS X:

script soe.txt ./error.sh 

确切的输出有点系统相关,但可能包含“Hello World”和“Segmentation Fault”。

也可以考虑添加适当的#include线和返回从主的值。

+0

有没有办法在文件中捕获'Segmentation fault'?我可以在bash内运行另一个bash吗? – lalli 2010-10-29 08:53:05

+0

是的,答案已更新。 – jjrv 2010-10-29 08:54:40

+0

啊,谢谢..... – lalli 2010-10-29 09:01:28

7

因为分割故障是严重。缓冲区不会被刷新,你的进程会被猛烈关闭。

你看到的文字时不进行重新定向运行的原因是标准输出行缓冲(即全缓冲仅用于如果该设备可以被确定为不是一个交互ISO C任务)。换句话说,只要看到换行符就会刷新,发生之前您的无效的参考。

但由于文件输出未行缓冲,信息仍然在等待当你的程序的宇宙是从它下面拽出被发送出去。

虽然这种支持是实现定义的,你可以设置一个特定的文件句柄使用setvbuf_IOLBF模式行缓冲,是这样的:

setvbuf (stdin, NULL, _IOLBF, BUFSIZ); 

main()开始 - 这样可以节省大量输入每条输出线都必须输入fflush

+0

有没有办法用重定向缓冲行? – lalli 2010-10-29 08:54:12

+0

谢谢,我猜想我必须愚弄调度程序,然后...... – lalli 2010-10-29 09:02:44

+0

@lalli,是的,你可以,我经常这样做,以避免必须在所有地方放置'fflush()'。查看'setvbuf()'的更新。 – paxdiablo 2010-10-29 09:03:09

3

我想这应该这样做:对于int

echo ./error.o | sh > error.txt 
+0

哦,这有助于,谢谢.. – lalli 2010-10-29 09:03:05

相关问题