我在OS X上遇到C ZeroMQ的奇怪问题。我正在使用指南中的“C中的多线程服务”代码,我只是在system("ls")
之后添加了对sleep(1)
的调用调用worker_routine函数。所以这个函数看起来像这样:
static void *
worker_routine (void *context) {
// Socket to talk to dispatcher
void *receiver = zmq_socket (context, ZMQ_REP);
zmq_connect (receiver, "inproc://workers");
while (1) {
char *string = s_recv (receiver);
printf ("Received request: [%s]\n", string);
free (string);
// Do some 'work'
sleep (1);
system("ls");
// Send reply back to client
s_send (receiver, "World");
}
zmq_close (receiver);
return NULL;
}
当我使用指南中的示例客户端连接到此服务器时,ls
会运行,但s_send会因NOENT错误而失败,并且不再处理任何请求。如果我删除system("ls")
调用,一切正常。
有谁知道可能会发生什么?
谢谢, 史蒂夫
答案 0 :(得分:1)
system
不是线程安全的。请参阅POSIX中的示例实现,以了解它为什么不能并且不能成为:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/system.html
特别是,它会改变信号处置,这是一种流程全局资源。
ls
的输出也可能会导致问题。您打算在哪里输出? system
的一个很好的替代是popen
,它允许你回读命令的输出并处理它或者在任何你想要的地方发送它。