我在這里測驗答案,但是當我使用 C 程式而不是 bash 腳本時,我無法讓它正常作業。
這是C程式。
// tss.c
#include <stdio.h>
int main()
{
while (1)
{
fprintf(stdout, "stdout: sias\n");
fprintf(stderr, "stderr: cias\n");
sleep(5);
}
return 0;
}
這是測驗結果,我只看到 stderr 而不是 stdout。
$ $ { tss 2>&1 1>&3 3>&- | sed -u 's/^/err: /'; } 3>&1 1>&2 | sed -u 's/^/out: /'
err: stderr: cias
err: stderr: cias
然后我注意到我需要在程式中執行“fflush(stdout)”。但有一件事我不明白為什么stderr不需要它,有沒有辦法讓它在不插入fflush的情況下作業?
uj5u.com熱心網友回復:
然后我注意到我需要在程式中執行“fflush(stdout)”。但有一件事我不明白為什么stderr不需要它,
stdout默認情況下是緩沖的——線路連接到終端時緩沖,否則塊緩沖。將程式的標準輸出連接到管道會產生“否則”的情況。 fflush()是在緩沖區填滿之前將緩沖輸出發送到管道的方式。
stderr默認情況下是無緩沖的。除非您更改它,否則輸出將stderr立即發送到輸出設備。
有沒有辦法讓它在不插入 fflush 的情況下作業?
如果沒有fflush(),輸出 tostdout將在緩沖區大小的塊中發出。如果您希望 stdout 沒有緩沖,例如 stderr,那么您可以使用setvbuf().
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/520105.html
標籤:C重击壳io重定向
