C 管道与sleep()组合时未按预期工作

C 管道与sleep()组合时未按预期工作,c,pipe,C,Pipe,我有这样一个代码片段(测试代码,所以不要太在意样式): 它一直打印“写入0”。但是,如果我注释掉sleep(1),它仍然会打印“writed 0”,但会打印“apple”。我不知道发生了什么事。为什么我不能保持睡眠(1)并让它每1秒打印一次?为什么它写0而不是6呢?如果(write=write(fd[1],第7行)=-1) 如果((write=write(fd[1],第7行))==-1)使用时出错 大多数情况下,编码人员通常会忘记这一点……写入操作不会在零字节处停止,并且此代码可能会无效地尝试访

我有这样一个代码片段(测试代码,所以不要太在意样式):

它一直打印“写入0”。但是,如果我注释掉sleep(1),它仍然会打印“writed 0”,但会打印“apple”。我不知道发生了什么事。为什么我不能保持
睡眠(1)
并让它每1秒打印一次?为什么它写0而不是6呢?

如果(write=write(fd[1],第7行)=-1)

如果((write=write(fd[1],第7行))==-1)使用
时出错


大多数情况下,编码人员通常会忘记这一点……

写入操作不会在零字节处停止,并且此代码可能会无效地尝试访问
“apple”[6]
。(这不是问题的原因。)@aschepler哦,这是我测试的一部分,我想看看如果我指定一个比实际字符串更长的大小会发生什么:)这确实解决了“写入0”的问题,但它仍然不会打印“apple”,如果我将它移出while循环,它只会在raed(raed=read(fd[0],line,10)>0时打印相反,使用((raed=read(fd[0],line,10))>0)必须使用括号,因为==的优先级高于赋值运算符…@Xufeng-当缓冲区已满或缓冲区中有新行时,缓冲区将被刷新。这是
printf
int main() {
    int fd[2];
    pipe(fd);
    int id = fork();

    if (id > 0) {
        char *line = "apple";
        close(fd[0]);
        for (;;) {
            int written;
            if (written = write(fd[1], line, 7) == -1) {
                break;
            }
            printf("written %d\n", written);
            sleep(1);
        }
        close(fd[1]);
    }
    else {
        char line[10];
        close(fd[1]);
        int raed;
        while (raed = read(fd[0], line, 10) > 0) {
            printf(line);
        }
        printf("read %d\n", raed);
        close(fd[0]);
    }
    return 0;
}