簡體   English   中英

關於stdout / stderr重定向

[英]About stdout/stderr redirections

我編寫了一個代碼來故意獲取運行時錯誤:

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

但這兩個文件都是空的。 為什么?

編輯:

我實際上正在編寫一個用於遠程編譯和執行ac程序的腳本。 從答案我得到Segmentation Fault不是程序的錯誤輸出。 那么,有沒有辦法捕獲輸出? 此外,該程序只是一個示例,所以我不能添加語句。 可以通過重定向以任何其他方式進行行緩沖嗎?

so.txt是空的,因為stdout在崩潰之前沒有刷新,因此緩沖的內容丟失了。 如果添加:fflush(stdout); 在printf命令之間,它將包含預期的文本。

您的soe.txt也缺少消息“Segmentation Fault”,因為它是由shell打印的,而不是由您的程序打印的,因此不是您要重定向的程序輸出的一部分。

如果你不能修改代碼,你可以通過欺騙程序來打開行緩沖,認為它打印到tty。 創建腳本error.sh:

#!/bin/sh
./error.o

然后執行chmod a + x error.sh並在Linux上調用它:

script soe.txt -c ./error.sh

或者在OS X上這樣:

script soe.txt ./error.sh

確切的輸出在某種程度上取決於系統,但可能包含“Hello World”和“Segmentation Fault”。

還要考慮添加適當的#include行並從main返回一個值。

因為分段錯誤很嚴重 緩沖區不會被沖洗,您的過程會被猛烈關閉。

在沒有重定向的情況下運行時看到文本的原因是標准輸出是行緩沖的(ISO C要求僅在可以確定設備不是交互式設備時才使用完全緩沖)。 換句話說,它會在看到換行符時刷新,並且無效的解引用之前發生。

但是因為文件輸出不是行緩沖的,所以當程序的Universe從它下面被拉出時,信息仍然在等待發送出去。

雖然對此的支持是實現定義的,但您可以使用帶有_IOLBF模式的setvbuf將特定文件句柄設置為行緩沖,例如:

setvbuf (stdout, NULL, _IOLBF, BUFSIZ);

main()的開頭 - 它可以節省大量的輸入,而不必每次輸出都是fflush

我認為應該這樣做:

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

暫無
暫無

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

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