gpt4 book ai didi

使用 ZeroMQ 时从线程调用 system()

转载 作者:行者123 更新时间:2023-11-30 19:22:13 24 4
gpt4 key购买 nike

我在 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")打电话一切正常。

有人知道会发生什么吗?

谢谢,史蒂夫

最佳答案

system 不是线程安全的。请参阅 POSIX 中的示例实现,了解为什么它不是也不可能是:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/system.html

特别是,它改变了信号处置,这是一种进程全局资源。

也有可能 ls 的输出到了导致问题的地方。您打算将输出输出到哪里? system 的一个很好的替代品是 popen,它允许您读回命令的输出并对其进行处理或将其发送到您想要的任何地方。

关于使用 ZeroMQ 时从线程调用 system(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17751195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com