Почему мой канал не читает в printf, несмотря на замену stdin? - PullRequest
0 голосов
/ 16 февраля 2020

Цель - использовать dup, dup2 и pipe для связи между родительским и дочерним процессами. Просто чтобы понять, как использовать dup и pipe. Функция multby, вызываемая дочерним процессом, принимает число в качестве аргумента (3) и умножает его на ввод пользователя (в данном случае 5, как напечатано в родительском), чтобы получить продукт. (должно быть 15)

#include <stdio.h> 
#include <unistd.h> 

void main(int argv, char *argc) { 
    int testpipe[2]; 
    pipe(testpipe); 
    int PID = fork(); 
    if (PID == 0) { 
        dup2(testpipe[0], 0); 
        close(testpipe[1]); 
        execl("./multby", "multby", "3", NULL); 
        close(testpipe[0]); 
        close(0); 
    } else { 
        dup2(testpipe[1], 1); 
        close(testpipe[0]); 
        printf("5"); 
        close(1); 
        close(testpipe[1]); 
        wait(NULL); 
    }  
}

Вот код для мультбай. Я также добавил несколько операторов fprintf для устранения неполадок. В частности, он печатает 2 числа, которые нужно умножить (которые должны быть 3 и 5, как указано выше).

#include <stdio.h>

int main(int argv, char *argc[]) {
  fprintf(stderr,"exec successful\n");
  if (argv < 2) {
    fprintf(stderr, "Usage: %s <factor>\n", argc[0]);
    return 1;
  }      

  size_t a, b;
  sscanf(argc[1], "%zu", &a);
  fprintf(stderr, "a: %zu\n", a);

  if (scanf("%zu", &b) != 1) {
    fprintf(stderr, "No input %zu\n", a);
    return 1; 
  } 
  fprintf(stderr, "b: %zu\n", b);
  printf("%zu", a*b);
  fprintf(stderr, "multby successful\n");
  return 0;
}

Однако, это мой результат: exe c success a: 3 Нет ввода 3

5 не было зарегистрировано с конца чтения канала.

Может кто-нибудь сообщить мне, что я делаю неправильно?

1 Ответ

3 голосов
/ 16 февраля 2020

Вы используете printf(“5”); для передачи данных дочернему элементу, но стандартный вывод по крайней мере буферизуется строкой, поэтому ничего не записывается до отправки новой строки (или fflush(stdout)). Затем вы close(1); закрываете стандартный вывод, который не вызывает sh стандартных буферов ввода / вывода. Так что ничего не отправлено ребенку. Используйте fclose(stdout);, чтобы получить 5, отправленных ребенку.

...