네트워크 패킷 리스너 프로그램을 작성했고 스레드가 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 시간 이상) 실행되면 프로그램을 종료 할 수 없습니다. 사실, 신호 처리기는 호출되지 않습니다.
무엇이 문제 일 수 있습니까? 신호를 잡는 스레드는 무엇입니까?
미리 감사드립니다. 도움을 주시면 감사하겠습니다.
나는 의사 코드를 사용하지 않을 것이고, 나는 내 작업을 더 잘 이해하기 위해 사용했다. 귀하의 제안에 대한, 불행히도 내 문제를 해결하지 않기 때문에 신호 처리기 전혀 호출되지 않습니다. – Creed