socketpair() и создание новых дочерних процессов после 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 открытым?

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам