為什麼不打印 0 到 999?

和我

在 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);
    }
}
知乎

問題很簡單:您將空指針傳遞給readwrite

xfrom的定義int *x = 0;改為:

char x[1] = { 0 };

正如發布的那樣,這種行為有點違反直覺:

  • 傳遞一個空指針write導致它-1立即返回,設置errnoEINVAL

  • 相反,傳遞一個空指針會read導致它等待輸入,並且只有輸入可用時才返回-1並設置errnoEINVAL這導致兩個進程都阻塞了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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

REGEX用于-999到999之间的数字,但不包括-0

如何检查变量是否为0到999之间的数字?

為什麼全局位置打印0,0

為什麼/如何`print(*range(*b'e'))` 寫從 0 到 100 的數字?

设置Vuetify规则,用于0到999之间的数字或无输入

为什么此代码打印0到297,而不打印0到大于297的东西?

我如何在C#中打印像AAA001到zzz999的字母

使用正则表达式从0到999之间的数字中提取带有数字的字符串

為什麼不打印出變量的值?

在 javascript 中的 Date 構造函數上為字符串“0”到“110”解析字符串背後的邏輯是什麼?

為什麼 minOccurs="0" 不允許元素為空?

当执行此命令时:`“((exec -l -a特殊名称/ bin / bash -c'echo $ 0')2>错误”`,为什么输出`[[7 ^ [[r ^ [[999; 999H ^ [[ 6n`到stderr

從 mp3 文件打印藝術家信息時,為什麼會出現“\u{0}”?

為什麼我不能將輸出打印為範圍 n1 到 n2 之間的唯一數字數?

為什麼這個元素的寬度不是 0?

什麼時候 memset 為 0 不可移植?

為什麼這個地址是 0xFFFFFFFF?

為什麼我不能寫“if mod = 0”?

Jar打印转换并打印“ $?” 到0

Spring Security重定向到状态码为999的页面

Java-获取100到999之间的随机数

生成 1 到 999 之间的随机数

為什麼這個程序退出循環而不打印任何輸出?

為什麼 curl-config --cflags 不打印 libcurl 的頭文件目錄?

為什麼我的 C 函數不打印任何東西?

當未連接的代碼行被取消註釋時,為什麼這個 C 程序會檢測到字符串中的兩個 '\0' 字符?

Java数字转换为单词(0-999)

為什麼從 html 到 js 文件的元素作為對象

為什麼在 python 中使用 map 時運行時為 0