在 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);
}
}
問題很簡單:您將空指針傳遞給read
和write
。
將x
from的定義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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句