C에서 프로세스의 유무를 구하려 하는데요.
글쓴이: route1st / 작성시간: 일, 2015/06/14 - 2:34오전
UDP로 서버 클라이언트 프로그램을 짜고 있습니다.
클라쪽에서 GetCurrentProcessID를 가지고 PID를 구했는데요
서버에서 이 PID를 가지고 프로세스가 존재하는지 체크하려고 합니다.
목적은 클라이언트 프로세스가 죽었을 때 서버에서 확인하려 하는데요.
atexit로 죽었다고 패킷 보내는 것도 생각했었는데,
메인이 먼저 죽고 실행되는거라 소켓이 없어져서 통신이 안될 것 같은데 맞는건가요
관련 함수나 방법 있으면 조언 부탁드립니다
Forums:
프로세스가 존재하는지 체크 => 다른 방법으로 구현은
프로세스가 존재하는지 체크 => 다른 방법으로 구현은 어떤가요
- 클라에서 쓰레드 하나 생성 후 주기적으로 서버에 사전에 정의된 패킷을 보낸다던가.
- C++의 경우 RAII 기법 이용, 메인이 죽을 때 소멸자 이용해서 패킷 전송
(atexit와 유사하지만 소켓등의 자원등에 대해서 자원해제 순서를 지정할 수 있으니)
class DeadHandler { public:
후자의 경우 이런식으로 짤 수 있을 것 같네요
프로세스가 정상적으로 종료되지 않고 '죽는 경우'에는
프로세스가 정상적으로 종료되지 않고 '죽는 경우'에는 소멸자의 호출이 보장되지 않습니다. 보통은 호출되지 않습니다.
아.. 여태껏 잘못알고 있었군요
소멸자 호출이 보장되는것으로 알고있었습니다.
지적 감사합니다.
그렇다면..
출처 : http://www.cs.ucr.edu/~kishore/cs153/signals.c
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/multi_process
두개 짜깁기 + 주석 직접 작성함.
이건 어떤가요? 커널이 죽지 않는 이상, 프로세스가 종료되었을 때
클라가 서버에 정상적으로 메세지를 전달 할 수 있을것 같은데요.
...
이렇게 하면 프로세스가 종료되었을 때 "매우 많은 경우" 메시지를 전달할 수는 있겠습니다만, 100% 보장은 안됩니다.
생각해 보면 당연한 얘기죠. 누가 랜선 뽑고 전원 내려버리면 어떻게 하겠습니까.
따라서 서버 입장에서 보면 "프로세스 종료" 메시지를 받을 경우 뭔가 좀 더 효율적인 처리를 할 수는 있겠지만, 그건 그냥 운이 좋은 케이스일 뿐이지 재수없으면 클라이언트는 언제든지 소리없이 죽을 수 있다고 가정하고 프로그램을 짜야 합니다.
답변이 늦었습니다!
fork를 한번 써봐야겠네요ㅎㅎ
제가 찾아봐야 하는데 출처 남겨주셔서 감사합니다.
댓글 달기