#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. Что ж, форк очень опасен, если вы не контролируете весь код внутри своего процесса. Вероятно, разветвленные процессы теперь разделяют что-то, чего они не ожидают. Вот почему разветвление — такая плохая модель. Трудно гарантировать, что это безопасная операция.