2014-09-25 2 views
0

네트워크 패킷 리스너 프로그램을 작성했고 스레드가 2 개 있습니다. 둘 다 영원히 삽니다.하지만 그들 중 하나는 잠을 잘 자고 30 초는 90 초 정도 자게됩니다. 주요 함수에서, 나는 sigaction 함수를 사용하고 시그널 핸들러를 설치 한 후에, 나는이 2 개의 쓰레드를 생성했다. 스레드를 생성 한 후 주 함수는 무한 루프 인 pcaploop 함수를 호출합니다. 내 프로그램의 기본 구조 : (내가 의사 구문을 사용합니다) 여기다중 스레드 환경 - 유닉스 환경에서의 C++에서의 신호 처리 (FreeBSD 및 Linux)

signalHandler() 
    only sets a flag (exitState = true) 

thread1() 
{ 
    while 1 
    { 
     sleep 30 sec 
     check exit state, if so exit(0); 
     do smth; 
    } 
} 

thread2() 
{ 
    while 1 
    { 
     sleep 90 sec 
     check exit state, if so exit(0); 
     do smth; 

    } 
} 

main() 
{ 
    necassary snytax for sigaction ; 
    sigaction(SIGINT, &act, NULL); 
    sigaction(SIGUSR1, &act, NULL); 

    create thread1; 
    create thread2; 

    pcaploop(..., processPacket,...); // infinite loop, calls callback function (processPacket) everytime a packet comes. 

    join threads; 
    return 0; 

} 

processPacket() 
{ 
    check exitState, if true exit(0); 
    do smth; 
} 

그리고 내 질문이다. CTRL-C를 누르면 프로그램이 종료되지 않습니다. 프로그램이 6-7 시간 내에 실행되지 않으면 CTRL-C를 누르면 프로그램이 종료됩니다. 프로그램이 1 박 이상 (적어도 10 시간 이상) 실행되면 프로그램을 종료 할 수 없습니다. 사실, 신호 처리기는 호출되지 않습니다.

무엇이 문제 일 수 있습니까? 신호를 잡는 스레드는 무엇입니까?

미리 감사드립니다. 도움을 주시면 감사하겠습니다.

답변

0

나는이 문제에 직면 한 사람들을 위해이 글을 쓰고있다. 내 문제는 스레드 동기화에 관한 것이 었습니다. 내가 처리 동기화 문제가있어, 지금 프로그램, 신호를 처리 할 수 ​​있습니다. 내 충고는 동기화를 다시 확인하고 제대로 작동하는지 확인하는 것입니다.

늦게 답변드립니다.

편집 : 가 나는 또한 신호가 을 처리하는은 sigaction을 사용하고 난 내 글로벌 부울 변수 오순절이 정의를 변경할 수 있습니다

정적 휘발성 sig_atomic_t exitFlag = 0;

이 플래그는 신호의 수신 여부를 확인하는 데 사용되었습니다.

0

기본적으로 사용자가 입력 한 모든 의사 코드를 제거하고 최소한의 작업 코드는 그대로 두는 것이 좋습니다.

지금까지 귀하의 예에서 볼 수 있듯이 sigaction의 오류 처리가 누락되었습니다.

코드의 오류 검사를 수행하십시오.

+0

나는 의사 코드를 사용하지 않을 것이고, 나는 내 작업을 더 잘 이해하기 위해 사용했다. 귀하의 제안에 대한, 불행히도 내 문제를 해결하지 않기 때문에 신호 처리기 전혀 호출되지 않습니다. – Creed