Я не уверен, что я даже лаю на правильное дерево здесь ... но здесь идет.
Я пытаюсь передать данные из родительского процесса всем детям. Это простая серверная программа, которая в основном ведет список подключенных клиентов, а затем отправляет таблицу маршрутизации подключенных клиентов каждому клиенту. В конечном итоге это будет включать в себя структуру информации о каждом клиенте ... но сейчас я просто хочу, чтобы каждый разветвленный процесс получал ту же информацию от родителя.
В родительском процессе сначала я настраивал свои каналы и устанавливал их в неблокирующую (для тех случаев, когда в канале нет новых данных). После того, как соединение установлено с клиентом, переменная количества записей увеличивается, чтобы отразить это новое соединение. Затем я перевожу дочерний процесс в новую функцию и обновляю свой массив каналов новым количеством записей в таблице (на данный момент у меня есть 10 каналов, чтобы посмотреть, нужно ли мне сохранить отдельный канал для каждого дочернего процесса).
pid_t pid;
int numchildren;
int i, n;
/* Create the pipes. */
for(i = 0; i < 10; i++)
{
if (pipe (mypipe[i]))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
}
for(i = 0; i < 10; i++)
{
for(n=0; n<2; n++)
{
// Get previous flags
int f = fcntl(mypipe[i][n], F_GETFL, 0);
// Set bit for non-blocking flag
f |= O_NONBLOCK;
// Change flags on fd
fcntl(mypipe[i][n], F_SETFL, f);
}
//close(mypipe[i][0]);
}
pid = fork();
if (pid == (pid_t) 0)
{
close (mypipe[numentries-1][1]);
recievecmds(new_fd, mypipe[numentries-1][0]);
close(new_fd);
return EXIT_SUCCESS;
}
else if (pid < (pid_t) 0)
{
fprintf (stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
else
{
sprintf (buf,"%d",numentries);
for(i = 0; i < 10; i++)
write(mypipe[i][1], buf, strlen(buf));
memset(&buf, 0, sizeof buf);
}
А потом я пытаюсь прочитать что в трубе в функции recievecmds ():
nbytes = read(mypipe[childindex][0], buf, sizeof(buf));
Первый подключенный клиент сообщает мне numentries = 1, второй клиент сообщает мне numentries = 2 и так далее. Я имею в виду, что на самом деле я даже не вижу смысла для канала, так как кажется, что, что бы я ни вставил в канал, я мог бы просто передать его в функцию, которую я вызвал на развилке. Я поступаю об этом неправильно? Это было очень сложно пытаться понять это. Как я могу сохранить все мои дочерние процессы обновленными одновременно от моего родительского процесса?
Заранее большое спасибо.
edit - Моя главная проблема заключалась в том, что я каждый раз переопределял канал в бесконечном цикле while. Очень глупая ошибка, сразу понял, что, наверное, корень моей проблемы. Тем не менее, в то время как теперь первая комбинация child / pipe содержит правильные данные ... вторая - нет. Я посмотрю, смогу ли я понять это самостоятельно, спасибо за совет!
Конечно, сейчас у меня возникают проблемы, потому что я вручную выбираю опцию, чтобы получить данные с конвейера. Мне нужно будет придумать способ, чтобы, возможно, либо получать данные для всех каналов каждый раз, когда они обновляются, либо обязательно получать только самые новые данные (вероятно, только один символ за раз).
Спасибо, что терпите меня, ребята! И я прошу прощения за то, что не выложил всю программу ... но есть немало. Я определенно должен был упомянуть, что у меня это в бесконечном цикле.