Программирование на сокете: объединение данных из процессов fork ()

0

Я работаю над проектом Unix для сокета/сетевого программирования в C/C++. Я пишу простой сервер, который может получать сообщения TCP от нескольких клиентов. Следуя этому руководству, я написал сервер, чтобы accept() входящие клиентские соединения, а затем fork() чтобы обрабатывать отправку некоторых сообщений назад/вперед каждому клиенту. Пока все было довольно легко.

Теперь мне нужно взять данные, собранные в каждом дочернем процессе fork() -ed, передать его обратно в родительский процесс, который accept() -ing, и разрешить родительскому процессу продолжать работу с собранными данными и позволить каждый ребенок return 0; , (1 процесс → много процессов сбора данных → 1 процесс со всеми данными)

Я не знаю, как это сделать. Мой курс учит сетевому взаимодействию, а не управлению процессами в Unix. Как дочерние процессы отправляют данные обратно родителям? Или они могут каким-то образом обмениваться данными между собой? Или я полностью подхожу к этому по-другому?

  • 0
    Вполне возможно, что проще всего использовать pthread_create для запуска функции для обработки каждого принятого клиентского соединения, тогда вы можете легко заставить потоки сгенерировать свои данные и сообщить об этом главному принимающему потоку (этот поток может собрать void* s для data, так как это тип «result», возвращаемый выходными потоками в качестве управляющего потока pthread_join .).
Теги:
networking
sockets
fork

1 ответ

2
Лучший ответ

Общим способом соединения между разветвленным дочерним сервером и его родителем является канал. Вот пример:

#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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню