【问题标题】:Calling system() from threads with while using ZeroMQ在使用 ZeroMQ 时从线程调用 system()
【发布时间】:2013-07-20 00:47:12
【问题描述】:

我在 OS X 上使用 C ZeroMQ 时遇到了一个奇怪的问题。我正在使用指南中的“C 中的多线程服务”代码,并且我只是在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") 调用一切正常。

有人知道会发生什么吗?

谢谢, 史蒂夫

【问题讨论】:

  • s_send()是如何实现的?

标签: c macos zeromq


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多