2013-10-20 75 views
0

我正在做C中的套接字編程。本質上,我需要一個服務器在單獨的線程中運行無限制的偵聽循環,並且只要它接受一個新的連接,就必須創建一個新的客戶端線程處理客戶的請求。Listening線程不打印語句

下面我有主要函數聲明端口號,並調用函數createListenThread。此函數創建一個新線程並調用函數listenLoop

int main(int argc, char *argv[]) 
{ 
    int client_port = 6000; 
    createListenThread(client_port); 
} 

void createListenThread(int listen_port) 
{ 
    pthread_t listen_tid; 

    printf("In createListenThread\n"); 
    // listenLoop(&listen_port); 

    if(pthread_create(&listen_tid, NULL, listenLoop, &listen_port) != 0) 
     socketError("Could not create thread\n");  

} 

void *listenLoop(void *arg) 
{ 
    pthread_detach(pthread_self()); 

     int listen_socket, listen_port, *client_socket, struct_size; 
    struct sockaddr_in client_addr; 
    pthread_t client_tid; 

    listen_port = *((int *)arg);   
    listen_socket = createSocket(listen_port); 
    struct_size = sizeof(struct sockaddr_in); 

    while(1) 
    { 
     printf("In ListenLoop\n"); 
      client_socket = malloc(sizeof(int)); 
      *client_socket = -1; 
      *client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &struct_size); 

      printf("Received connection request from (%s , %d)\n", 
      inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); 

      pthread_create(&client_tid, NULL, starterFunction, client_socket); 
    } 

    close(listen_socket); 
} 

我的問題是,每當我運行服務器,只有「在ListenThread」「在ListenLoop」從不打印。我甚至試過fprintf(標準輸出,「在ListenLoop」)和fflush(標準輸出),但聲明仍然沒有打印。當我註釋掉:

if(pthread_create(&listen_tid, NULL, listenLoop, &listen_port) != 0) 
     socketError("Could not create thread\n"); 

,並簡單地調用ListenLoop如下:

listenLoop(&listen_port); 

兩個打印語句出現。在創建線程和調用ListenLoop函數的方式中是否有明顯的錯誤? ListenLoop函數是否被執行過?

編輯:我跑在gdb的程序,其打印執行以下操作:

In createListenThread 
[New Thread 0xb7e30b70 (LWP 10024)] 
[Thread 0xb7e30b70 (LWP 10024) exited] 
[Inferior 1 (process 10021) exited normally] 

爲什麼線程退出??

+0

主線程立即退出。你需要一些投入運營添加到它,像「按Enter鍵退出」 + scanf函數。 –

回答

2

問題在於您的主函數在調用createListenThread後立即返回。您應該等待您的線程函數在您的createListenThread內完成使用pthread_join,否則程序可能會在線程函數完成之前終止。在線索上調用pthread_join將等待線程函數返回,因此肯定有機會在main()返回之前運行。

+0

如果我添加在pthread_join(listen_tid,NULL),它解決了被印刷在原始問題即線程不再存在並且statment「以ListenLoop」。但是,有一個問題會破壞創建單獨監聽線程的全部目的。這會阻塞主線程,即主線程不能繼續執行其他工作。有沒有解決這個問題的工作? – NewToAndroid

+0

當主進程在主完成後終止時,所有線程也被終止。我相當肯定這沒有解決方法,但如果有的話,我相信有人會糾正我。 – mathematician1975

+0

@NewToAndroid閱讀這個類似問題的一些答案 - 它是我的幫助http://stackoverflow.com/questions/11875956/main-thread-exit-does-other-exit-too – mathematician1975

0

我希望你聲明所有的功能,上述主要...但你真的應該打電話給你的listenLoop在主線程。否則,你創建一個線程來運行循環,主線程被動地等待它。而且你不會被參數傳遞,線程等待等困擾。

listenLoop然後可以是一個真正的無效,不再是一個void *,因爲你不返回任何東西。

如果你把一個進程,它將使意義,因爲它是建立由init進程採取的守護進程immediateley正確的方法,但對於它的線程是根本沒用。