Форк родительский ребенок общение
Мне нужно, чтобы родительский процесс общался с каждым ребенком отдельно.
У меня есть дети, которым нужно общаться с родителями отдельно от других детей.
Есть ли способ для родителя иметь частный канал связи с каждым ребенком?
Также может ли ребенок, например, отправить родителю переменную структуры?
Я новичок в таких вещах, поэтому любая помощь приветствуется. Спасибо
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;
}
Код довольно понятен:
- Родительские вилки ()
- Ребенок читает () из трубы до EOF
- Родитель пишет () в канал, затем закрывает () его
- Данные были переданы, ура!
Оттуда вы можете делать все, что захотите; просто не забудьте проверить ваши возвращаемые значения и прочитать dup
, pipe
, fork
, wait
... руководства, они пригодятся.
Существует также множество других способов обмена данными между процессами, они могут вас заинтересовать, хотя и не соответствуют вашим "частным" требованиям:
- общая память "ШМ", название говорит само за себя...
- сокеты, они, очевидно, работают так же хорошо, если используются локально
- FIFO-файлы, которые в основном представляют собой каналы с именем
или даже простой файл... (Я даже использовал сигналы SIGUSR1/2 для однократной отправки двоичных данных между процессами... Но я бы не рекомендовал это, ха-ха.) И, возможно, еще кое-что, о чем я не думаю сейчас.
Удачи.