在 Linux 上,為什么會列印0并掛起而不是列印 0 到 999?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
int n = 1000;
int fromparent[2];
int fromchild[2];
int *x = 0;
pipe(fromparent);
pipe(fromchild);
if (fork() == 0) {
/* child */
while (1) {
read(fromparent[0], x, 1);
write(fromchild[1], x, 1);
}
} else {
/* parent */
for (int i = 0; i < n; i ) {
printf("%d\n", i);
write(fromparent[1], x, 1);
read(fromchild[0], x, 1);
}
exit(0);
}
}
uj5u.com熱心網友回復:
問題很簡單:您將空指標傳遞給read和write。
將xfrom的定義int *x = 0;改為:
char x[1] = { 0 };
正如發布的那樣,這種行為有點違反直覺:
傳遞一個空指標
write導致它-1立即回傳,設定errno為EINVAL。相反,傳遞一個空指標會
read導致它等待輸入,并且只有在輸入可用時才回傳-1并設定errno為EINVAL。這導致兩個行程都阻塞了read呼叫。
這是一個簡單的測驗來說明這種行為:
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main() {
int n;
errno = 0;
n = read(0, NULL, 1);
printf("n=%d, errno=%d\n", n, errno);
return 0;
}
如果從控制臺運行,該程式將等待輸入,并n=-1, errno=14在用戶點擊 后列印enter。
相反,它n=0, errno=0在標準輸入從 重定向時列印/dev/null。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370318.html
上一篇:程式未正確讀取“雙重”輸入
下一篇:C語言位運算問題
