2013-06-15 2 views
1

유닉스에서 c로 채팅을하고있다. 나는 서버 쪽과 클라이언트 쪽을 가지고있다. 클라이언트가 쉘 창을 닫을 때를 제외하고 모두 잘 작동합니다. 그 경우 클라이언트는 그가 가고있는 서버에 말하지 않았고 서버는 그가 여전히 로그인했다고 생각합니다.쉘이 닫힐 때 어떤 신호를 보냅니 까?

클라이언트가 X 버튼을 눌러 단말기를 닫으면 신호를 처리하고 싶습니다. 내 프로세스에는 어떤 신호가 있습니까? SIGHUP, SIGQUIT 및 SIGTERM을 처리하려고했지만 작동하지 않는 것 같습니다.

+0

에서 찾을 수 있습니까? 그렇지 않으면 epoll을 사용하는 것이 좋습니다. 그렇게하면 클라이언트를 닫을 때 (클라이언트 측 소켓을 닫음) epoll이 처리 할 것입니다. 예를 들어 전체보기 https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/ –

+4

SIGHUP이 무엇을 얻어야할까요? 어쩌면 신호 처리기에 문제가있을 수 있습니다. –

+0

TCP 소켓을 사용하고 있습니까? 자세한 내용을 추가하십시오. 터미널을 닫으면 클라이언트가 종료되므로 서버 측에서 read 함수는 0을 반환한다는 사실을 사용할 수 있습니다. – Edge7

답변

0

클라이언트가 X를 눌러 터미널을 닫고 서버 응용 프로그램에서 캡처 할 때 사용자 정의 신호 SIGUSR1 또는 SIGUSR2 중 하나를 보낼 수 있습니다. 이를 위해서는 열려있는 터미널 목록에서 서버가 신호 터미널을 수신하는 터미널에 대한 정보를 유지해야합니다. 이 신호에 대한

더 설명을 서버의 측면에서 다중의 양식을 사용하고 사람 신호의 페이지 또는 here

Signal  Value  Action Comment 
--------------------------------------------------- 
SIGUSR1 30,10,16 Term User-defined signal 1 
SIGUSR2 31,12,17 Term User-defined signal 2 
SIGTSTP 18,20,24 Stop Stop typed at tty 
관련 문제