나는 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);
}
내 문제는 내가 만 "ListenLoop에서" 및 "ListenThread에서"서버를 실행할 때마다 인쇄되지 않습니다 것입니다. 나는 fprintf (stdout, "ListenLoop")와 fflush (stdout)을 시도해 보았지만, 여전히 그 문장은 인쇄되지 않았다.
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와 같은 입력 연산자를 추가해야합니다. –