Связь между дочерним и родительским процессами через канал в unix c

#c #linux #sockets #unix #less-unix

Вопрос:

Программа сначала создает канал, а затем создает дочерний процесс текущего процесса fork() .

Затем каждый процесс закрывает файловые дескрипторы, которые не нужны для каналов чтения и записи.

Дочерний процесс выполняет ls -a команду по текущему пути и записывает выходные данные выполнения команды в канал, копируя дескриптор записи fd[1] канала в стандартный вывод; родительский процесс считывает данные канала и отображает их fd[0] .

Каждый процесс в Linux снабжен тремя стандартными файловыми дескрипторами, включая стандартные файлы ввода, вывода и ошибок.

По умолчанию:

  • Стандартный ввод-это клавиатура, абстрагированная в виде файла, чтобы упростить написание сценариев оболочки.
  • Стандартный вывод-это окно оболочки или терминал, из которого запускается скрипт, абстрагированный в виде файла, чтобы снова упростить написание сценариев и программ
  • Стандартная ошибка совпадает со стандартным выводом: окно оболочки или терминал, из которого запускается скрипт.

Файловый дескриптор-это просто число, указывающее на открытый файл. По умолчанию файловый дескриптор 0 (ноль) относится к стандартным входным данным и часто сокращается как стандартный ввод данных.

Файловый дескриптор 1 относится к стандартному выходу (stdout), а файловый дескриптор 2 относится к стандартной ошибке (stderr).

Вы можете использовать dup(2) функцию для дублирования дескриптора файла с дескриптором записи fd[1] канала с помощью функции dup2 , чтобы переместить стандартный вывод

Вопрос в том, как я могу выполнить команду, и после этого я прочитаю stdout в дочернем процессе.

Я выполняю его с помощью exec функции, строка после функции exec не будет выполняться, потому что теперь образ памяти дочернего процесса ls -l .

 #include lt;sys/types.hgt;  #include lt;stdio.hgt;  #include lt;string.hgt;  #include lt;unistd.hgt;  #define BUFFER_SIZE 25  #define READ_END 0  #define WRITE_END 1    int main(void)  {  char writemsg[BUFFER_SIZE] = "Greetings!";  char readmsg[BUFFER_SIZE];  int fd[2];  pid_t pid;    /* create the pipe */  if (pipe(fd) == -1) {  fprintf(stderr,"Pipe failed");  return 1;  }  /* fork a child process */  pid = fork();  if (pid lt; 0) { /* error occurred */  fprintf(stderr, "Fork Failed");  return 1;  }  if (pid gt; 0) { /* parent process */  /* close the unused end of the pipe */  close(fd[READ_END]);  /* write to the pipe */  write(fd[WRITE_END], writemsg, strlen(writemsg) 1);  /* close the write end of the pipe */  close(fd[WRITE_END]);  }  else { /* child process */  /* close the unused end of the pipe */  close(fd[WRITE_END]);  /* read from the pipe */  read(fd[READ_END], readmsg, BUFFER_SIZE);  printf("read %sn",readmsg);  /* close the write end of the pipe */  close(fd[READ_END]);  }    return 0; }  

этот код работает нормально. это простой код трубопроводной связи. пожалуйста, помогите мне решить часть выполнения команды и записать ее в дочерний файл из консоли

Комментарии:

1. В Интернете есть почти бесконечное количество примеров и руководств о том, как это сделать. Не говоря уже о множестве хороших книг. Вы хотя бы пытались прочитать страницы руководства по функциям, упомянутым в задании (особенно dup2 )?

2. 1/ В вашем текущем коде родитель отправляет сообщение своему ребенку, в то время как ваше требование заключается в том, чтобы ребенок отправлял сообщение своему родителю, поэтому в настоящее время вы используете канал в неправильном направлении. 2/ вы должны закрыть неиспользуемый конец и перенаправить стандартный вывод перед вызовом exec. Канал будет автоматически закрыт, когда ls команда завершится.

3. если вы знаете такие сайты или учебник, я, безусловно, воспользуюсь его помощью. Я пробовал их, но не смог найти никакого решения