Отправить строки с трубами и использовать сигнал в C? - PullRequest
1 голос
/ 03 мая 2020

Я должен сделать программу на C на Linux в качестве домашней работы. (Благодаря онлайн-лекциям мой учитель не дал нам примеров программ)

У нас есть Родитель и двое детей.

Первый дочерний элемент должен отправить строки родительскому элементу с помощью Pipe. Затем Родитель должен отправить Строки другому дочернему элементу, используя pipe. В конце концов, Другой ребенок должен передать сигнал родителю.

Может кто-нибудь показать мне очень упрощенный код для этого? - Я не могу найти простые примеры и описания.

1 Ответ

0 голосов
/ 03 мая 2020

Итак, вам нужна двунаправленная труба. Труба - это однонаправленный метод ip c, но вы можете легко создать двунаправленную трубу, используя две трубы. Теперь для создания трубы вы используете функцию pipe () (https://linux.die.net/man/2/pipe для документации). Я могу дать вам некоторую информацию о pipe (), первый аргумент - это массив из двух полей, если канал возвращает значение, отличное от -1, вызов завершается успешно, и в позиции 0 этого массива у вас есть файловый дескриптор, где вы можно использовать read для чтения содержимого канала, а в позиции 1 вы можете использовать write для записи в канал. Некоторое время go я пишу для упражнения двунаправленную трубу, чтобы я мог дать вам этот код в качестве примера, но, конечно, прочитайте документацию и поймите, что такое труба и так далее.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
#include <sys/wait.h>


int
main(void){
  int parents_fields[2];
  int child_fields[2];

  int parent_char;
  int child_char;
  char char_to_write;

  setbuf(stdout,NULL);

  if(pipe(parents_fields) == -1){
    perror("pipe() : parent_fields");
    exit(EXIT_FAILURE);
  }

  if(pipe(child_fields) == -1){
    perror("pipe() : child_fields");
    exit(EXIT_FAILURE);
  }

  switch(fork()){
  case -1:  // In case of error
    perror("fork() failed, terminating the program");
    exit(EXIT_FAILURE);
  case 0:   // Child
    // Closing unused file descriptors
    if(close(parents_fields[1]) == -1){
      perror("Child: Error closing parents_fields[1], terminatin the program");
      exit(EXIT_FAILURE);
    }

    if(close(child_fields[0]) == -1){
      perror("Child: Error closing child_fields[0], terminatin the program");
      exit(EXIT_FAILURE);
    }

    if(read(parents_fields[0],&parent_char,1) == -1){
      perror("Child: Error reading the parent pipe, terminating the program");
      exit(EXIT_FAILURE);
    }

    printf("%c\n",parent_char);

    parent_char = toupper(parent_char);

    printf("%c\n",parent_char);

    if(write(child_fields[1],&parent_char,1) == -1){
      printf("Child: Error reading the child pipe, terminating the program , %d , %d",child_fields[1],errno);
      exit(EXIT_FAILURE);
    }

    _exit(EXIT_SUCCESS);

    break;

  default:  //parent
    scanf("%c",&char_to_write);
    // Closing unused file descriptors
    if(close(parents_fields[0] == -1)){
      perror("Parent: Closing parents_fields[0], terminating the program...");
      exit(EXIT_FAILURE);
    }

    if(close(child_fields[1]) == -1){
      printf("Parent: Error closing child_fields[1], terminatin the program, %d",child_fields[1]);
      exit(EXIT_FAILURE);
    }

    if(write(parents_fields[1],&char_to_write,1) == -1){
      perror("Parent: Error writing on parent pipe");
      exit(EXIT_FAILURE);
    }

    if(read(child_fields[0],&parent_char,1) == -1){
      perror("Child: Error reading the child pipe, terminating the program");
      exit(EXIT_FAILURE);
    }

    printf("%c\n",parent_char);

    _exit(EXIT_SUCCESS);

    break;
  }

  return 0;
}
...