私はCでソケットプログラミングを行っています。本質的に、別のスレッドで無期限のリスニングループを実行するサーバーが必要であり、新しい接続を受け入れるたびに、クライアントの要求を処理するために新しいクライアントスレッドを作成する必要があります。
以下に、ポート番号を宣言し、関数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);
}
私の問題は、サーバーを実行するたびに、「In ListenThread」と「In ListenLoop」だけが出力されないことです。fprintf(stdout, "In ListenLoop") と fflush(stdout) も試しましたが、ステートメントはまだ出力されません。コメントアウトすると:
if(pthread_create(&listen_tid, NULL, listenLoop, &listen_port) != 0)
socketError("Could not create thread\n");
次のように ListenLoop を呼び出すだけです。
listenLoop(&listen_port);
両方の print ステートメントが表示されます。スレッドを作成して ListenLoop 関数を呼び出す方法に明らかな間違いはありますか? 関数 ListenLoop が実行されたことはありますか?
編集: gdb でプログラムを実行すると、次のように出力されました。
In createListenThread
[New Thread 0xb7e30b70 (LWP 10024)]
[Thread 0xb7e30b70 (LWP 10024) exited]
[Inferior 1 (process 10021) exited normally]
スレッドが終了するのはなぜですか??