Форк родительский ребенок общение

Мне нужно, чтобы родительский процесс общался с каждым ребенком отдельно.

У меня есть дети, которым нужно общаться с родителями отдельно от других детей.

Есть ли способ для родителя иметь частный канал связи с каждым ребенком?

Также может ли ребенок, например, отправить родителю переменную структуры?

Я новичок в таких вещах, поэтому любая помощь приветствуется. Спасибо

1 ответ

(Я просто предположу, что мы говорим о Linux здесь)

Как вы, наверное, узнали, fork() Сам будет просто дублировать вызывающий процесс, он не обрабатывает IPC.

Из вилки ручной:

fork () создает новый процесс, дублируя вызывающий процесс. Новый процесс, называемый дочерним, является точной копией вызывающего процесса, называемого родительским.

Наиболее распространенный способ обработки IPC после разветвления () - это использование каналов, особенно если вы хотите "частный канал связи с каждым ребенком". Вот типичный и простой пример использования, похожий на тот, который вы можете найти в pipe ручной (возвращаемые значения не проверяются):

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

   int
   main(int argc, char * argv[])
   {
       int pipefd[2];
       pid_t cpid;
       char buf;

       pipe(pipefd); // create the pipe
       cpid = fork(); // duplicate the current process
       if (cpid == 0) // if I am the child then
       {
           close(pipefd[1]); // close the write-end of the pipe, I'm not going to use it
           while (read(pipefd[0], &buf, 1) > 0) // read while EOF
               write(1, &buf, 1);
           write(1, "\n", 1);
           close(pipefd[0]); // close the read-end of the pipe
           exit(EXIT_SUCCESS);
       }
       else // if I am the parent then
       {
           close(pipefd[0]); // close the read-end of the pipe, I'm not going to use it
           write(pipefd[1], argv[1], strlen(argv[1])); // send the content of argv[1] to the reader
           close(pipefd[1]); // close the write-end of the pipe, thus sending EOF to the reader
           wait(NULL); // wait for the child process to exit before I do the same
           exit(EXIT_SUCCESS);
       }
       return 0;
   }

Код довольно понятен:

  1. Родительские вилки ()
  2. Ребенок читает () из трубы до EOF
  3. Родитель пишет () в канал, затем закрывает () его
  4. Данные были переданы, ура!

Оттуда вы можете делать все, что захотите; просто не забудьте проверить ваши возвращаемые значения и прочитать dup, pipe, fork, wait... руководства, они пригодятся.

Существует также множество других способов обмена данными между процессами, они могут вас заинтересовать, хотя и не соответствуют вашим "частным" требованиям:

  • общая память "ШМ", название говорит само за себя...
  • сокеты, они, очевидно, работают так же хорошо, если используются локально
  • FIFO-файлы, которые в основном представляют собой каналы с именем

или даже простой файл... (Я даже использовал сигналы SIGUSR1/2 для однократной отправки двоичных данных между процессами... Но я бы не рекомендовал это, ха-ха.) И, возможно, еще кое-что, о чем я не думаю сейчас.

Удачи.

Другие вопросы по тегам