Утверждения реального разветвленного UDP-сервера и дампы ядра

#node.js #udp #fork #assert

#node.js #udp #форк #утверждение

Вопрос:

Это работало безупречно в node 0.6.19, но теперь терпит неудачу.

Я написал разветвленный UDP-сервер в node. Однако узел не имеет реального fork, а кластер не выполняет UDP, поэтому я написал модуль на C , который просто вызывает fork (модуль, содержащий эту функцию, называется «hasher»)

 static Handle<Value> spoon(const Argumentsamp; args) // node sees this function as "fork"
{
HandleScope scope;
pid_t rval = fork();
if (rval < 0)
{
    return ThrowException(Exception::Error(String::New("Unable to fork daemon, pid < 0.")));
}
Handle<Value> n = v8::Number::New(rval);
return n;
}
 

Я привязываю UDP-порт и разветвляю все дочерние элементы.

 udp_server.bind(argv.udp_listen_port, '0.0.0.0');

// now create multiple children (loop starting with 1 is on purpose)                                                                
for (var i = 1; i < argv.multiple; i  )
{
    var pid = hasher.fork();           
    if (pid == 0)
        break;
}
 

Теоретически дочерние процессы не должны знать, что кто-то другой использует этот порт, и должны вести себя нормально. Тем не менее, я почти сразу (1 или 2 входящих UDP-пакета) запускаю сообщение assert:

 node-0.10.29: ../deps/uv/src/unix/stream.c:499: uv__server_io: Assertion `events == 1'

failed.

Aborted (core dumped)
 

Кто-нибудь имеет представление о том, что происходит?

Комментарии:

1. Что ж, форк очень опасен, если вы не контролируете весь код внутри своего процесса. Вероятно, разветвленные процессы теперь разделяют что-то, чего они не ожидают. Вот почему разветвление — такая плохая модель. Трудно гарантировать, что это безопасная операция.