socketpair () & amp; создание новых дочерних процессов после close () рабочего сокета

Во-первых, это не система Unix / Linux. Я работаю на IBM AS / 400 V7R1 (C ++ 98) и не имею доступа к fork (). Тем не менее, у меня есть spawnp () для запуска новых дочерних процессов, а AS / 400 поддерживает понятие групп процессов.

В моей системе у меня есть «головная» программа, которая запускает X детей. Эта глава вызывает accept () для входящих соединений и немедленно передает сокет одному из дочерних процессов через sendmsg (). Все дети сидят на recvmsg (). Для головной программы это выглядит примерно так:

rc = socketpair(AF_UNIX, SOCK_DGRAM, 0, pair_sd);
if (rc != 0) {
perror("socketpair() failed");
close(listen_sd);
exit(-1);
}
server_sd = pair_sd[0];
worker_sd = pair_sd[1];

// do some other stuff, set up arguments for spawnp()...
// ...

spawn_fdmap[0] = worker_sd;

for (int i = 0; i < numOfChildren; i++) {
pid = spawnp(spawn_argv[0], 1, spawn_fdmap, &inherit, spawn_argv, spawn_envp);
if (pid < 0) {
CERR << "errno=" << errno << ", " << strerror(errno) << endl;
CERR << "command line [";
for (int x = 0; spawn_argv[x] != 0; ++x) {
cerr << spawn_argv[x] << " ";
}
cerr << ']' << endl;
close(listen_sd);
exit(-1);
}
else {
CERR << "Child worker PID = " << pid << endl;
child_pids.push_back(pid);
}
}

// Close down the worker side of the socketpair.
close(worker_sd);

У меня есть причина / схема для запуска дополнительных дочерних процессов после начального запуска программы. Я планирую отправить программе head некоторый сигнал, который вызовет повторный вызов spawnp (). «Закрыть (worker_sd)» меня беспокоит, хотя. Могу ли я снова вызвать spawnp () после закрытия рабочего сокета? В конце концов, это просто число. Можно ли держать worker_sd открытым?

1

Решение

Могу ли я снова вызвать spawnp () после закрытия рабочего сокета?

После того как вы позвонили close на этом сокете файловый дескриптор больше не действителен в этом процессе.

Вероятно, вам нужна отдельная пара сокетов для каждого дочернего процесса, чтобы сообщения от разных дочерних процессов не чередовались / искажались.

0

Другие решения

Я думаю, что вызывать socketpair () для каждого ребенка не нужно, и это означает необходимость отслеживать дополнительные сокеты на стороне сервера. Я обнаружил, что удаление close () в ‘worker_sd’ позволяет мне создавать столько дополнительных дочерних процессов, сколько я хочу. Закрытие и создание дочернего процесса приводило к смерти нового ребенка, когда он пытался получить что-то от родителя. Я чувствовал, что это произойдет, и это произошло.

0

По вопросам рекламы [email protected]