Я работаю над проектом Unix для сокета/сетевого программирования в C/C++. Я пишу простой сервер, который может получать сообщения TCP от нескольких клиентов. Следуя этому руководству, я написал сервер, чтобы accept()
входящие клиентские соединения, а затем fork()
чтобы обрабатывать отправку некоторых сообщений назад/вперед каждому клиенту. Пока все было довольно легко.
Теперь мне нужно взять данные, собранные в каждом дочернем процессе fork()
-ed, передать его обратно в родительский процесс, который accept()
-ing, и разрешить родительскому процессу продолжать работу с собранными данными и позволить каждый ребенок return 0;
, (1 процесс → много процессов сбора данных → 1 процесс со всеми данными)
Я не знаю, как это сделать. Мой курс учит сетевому взаимодействию, а не управлению процессами в Unix. Как дочерние процессы отправляют данные обратно родителям? Или они могут каким-то образом обмениваться данными между собой? Или я полностью подхожу к этому по-другому?
Общим способом соединения между разветвленным дочерним сервером и его родителем является канал. Вот пример:
#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[ 0]); // close the read-end of the pipe
write( pipefd[ 1], argv[0], strlen(argv[0])); // send name to the server
close( pipefd[ 1]); //close the write-end of the pipe,
//send EOF to the server
exit( EXIT_SUCCESS);
}
else // if I am the parent then
{
close( pipefd[ 1]); // close the write-end of the pipe
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
wait( NULL); // wait for the child process to exit before I do the same
exit( EXIT_SUCCESS);
}
return 0;
}
вы также можете использовать разделяемую память или сокеты на localhost.
pthread_create
для запуска функции для обработки каждого принятого клиентского соединения, тогда вы можете легко заставить потоки сгенерировать свои данные и сообщить об этом главному принимающему потоку (этот поток может собратьvoid*
s для data, так как это тип «result», возвращаемый выходными потоками в качестве управляющего потокаpthread_join
.).