我正在做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]
爲什麼線程退出??
主線程立即退出。你需要一些投入運營添加到它,像「按Enter鍵退出」 + scanf函數。 –