无法将 printf 重定向到管道

Can't redirect printf to pipe

我想将 printf 的输出重定向到管道,但由于某些原因它似乎不起作用。起作用的是使用 write 代替。

这是我的程序

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv) {
  int fd[2];
  pipe(fd);
  pid_t id = fork();
  if (id < 0) {
    fprintf(stderr, "Error while forking #1!");
    exit(1);
  } else if (id == 0) {
    dup2(fd[0], STDIN_FILENO);
    close(fd[1]);
    char msg[200];
    read(STDIN_FILENO, msg, 200);
    fprintf(stderr, "received message: %s", msg);
  } else {
    dup2(fd[1], STDOUT_FILENO);
    close(fd[0]);
    char msg[] = "Hello from parent!\n";
    write(STDOUT_FILENO, msg, strlen(msg));
    /* printf("%s",msg); */
    while(wait(NULL)>0);
  }
  exit(EXIT_SUCCESS);
}

如果我用注释行替换 write,我的程序只会阻塞

在输出中添加换行符 (\n) 或按照 Barmar 的建议使用 fflush():

fprintf(stderr, "分叉 #1 时出错!\n");

fprintf(stderr, "分叉 #1 时出错!"); fflush(标准错误);

顺便说一句,已收到,未收到 ;)