2013-07-19 36 views
-1

我在OS X上使用C ZeroMQ有一個奇怪的問題。我正在使用指南中的「C代碼中的多線程服務」代碼,並且我簡單地添加了一個對system("ls")在worker_routine函數中調用sleep(1)之後。這樣的功能看起來像這樣:使用ZeroMQ從線程中調用系統()使用ZeroMQ時的線程

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")調用一切正常。

有誰知道可能會發生什麼?

謝謝你,史蒂夫

+1

s_send()是如何實現的? – jxh

回答

1

system不是線程安全的。見POSIX樣品實施的,爲什麼它不是一個理解和不能:

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

特別是,它改變信號性格,這是一個過程,全球性的資源。

ls的輸出也可能會導致問題。你打算如何輸出? system的一個好替代將是popen,它允許您讀回命令的輸出並處理它或將它發送到任何你想要的地方。