Вывод записывается дважды и перекрывается после конвейера и вилки - PullRequest
0 голосов
/ 27 мая 2020

Когда я компилирую и запускаю следующий код:

#include <stdlib.h>
#include <unistd.h>

#define N 20

int main() {
  int fd[2], p, n;
  char c[N];

  pipe(fd);
  p = fork();

  if (p == 0) {
    dup2(fd[1], 1);
    execlp("date" , "date" , NULL);
    write(fd[1], "Bye", 3);
  }
  else {
    close(fd [1]);
    while((n=read(fd[0], &c, N)) > 0) write(1, &c, N);
  }
  exit (0);
}

, результат будет следующим:

Wed May 27 15:28:21 CEST 2020
 15:28:21 

Похоже, что вывод даты записывается дважды и перекрывается но я не понимаю почему и как. Я вижу, что есть два файловых дескриптора для вывода (через dup2), но дата выполняется только один раз, а его вывод передается на входную сторону родительского канала. Как получается, что добавляется вторая неполная строка даты?

Заранее спасибо!

1 Ответ

3 голосов
/ 28 мая 2020

Поскольку вы передаете N в write вместо n, поэтому, когда read выполняет частичное чтение, вы снова записываете лишние байты из последнего чтения.

...