2013-10-20 2 views
0

나는 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] 

왜 스레드가 종료됩니다?

+0

메인 스레드가 즉시 종료됩니다. "Enter를 눌러 종료하십시오"+ scanf와 같은 입력 연산자를 추가해야합니다. –

답변

2

문제는 createListenThread을 호출 한 후 main 함수가 즉시 반환된다는 것입니다. 스레드 함수가 완료 될 때까지 createListenThread 안에 pthread_join을 사용하여 끝내야합니다. 그렇지 않으면 프로그램이 종료 될 수 있습니다. 스레드에서 pthread_join을 호출하면 스레드 함수가 반환 될 때까지 대기하므로 main()이 반환되기 전에 확실히 실행될 수 있습니다.

+0

pthread_join (listen_tid, NULL)을 추가하면 원래의 문제, 즉 스레드가 더 이상 존재하지 않고 "ListenLoop"구문이 인쇄됩니다. 그러나 별도의 청취 스레드를 만드는 모든 목적을 저지하는 문제가 있습니다. 이렇게하면 주 스레드가 차단되어 주 스레드가 다른 작업을 계속할 수 없습니다. 이 문제를 해결할 수있는 방법이 있습니까? – NewToAndroid

+0

주 프로세스가 주 완료 후에 종료하면 모든 스레드도 종료됩니다. 나는 거기에 대한 해결 방법이 없다는 것이 확실하지만, 그렇다면 누군가가 나를 교정 할 것이라고 확신한다. – mathematician1975

+0

@ NewToAndroid이 비슷한 질문에 대한 답변을 읽어보십시오. - 내 도움이 그것입니다. http://stackoverflow.com/questions/11875956/main-thread-exit-does-other-exit-too – mathematician1975

0

위의 모든 기능을 선언하기를 바랍니다 ... 그러나 실제로는 메인 스레드에서 listenLoop으로 전화해야합니다. 그렇지 않으면 루프를 실행하는 스레드를 만들고 주 스레드는 수동으로 기다립니다. 그리고 인자 전달, 쓰레드 대기 등등 당신은 걱정할 필요가 없습니다.

listenLoop은 아무 것도 반환하지 않기 때문에 실제 void가 될 수 있으며 더 이상 void *가 될 수 없습니다.

프로세스를 포크했다면, init 프로세스에 의해 채택 된 데몬 프로세스 immediateley를 만드는 올바른 방법이기 때문에 의미가 있습니다. 그러나 스레드의 경우 단순히 쓸모가 없습니다.

관련 문제