C에서 프로세스의 유무를 구하려 하는데요.
글쓴이: route1st / 작성시간: 일, 2015/06/14 - 2:34오전
UDP로 서버 클라이언트 프로그램을 짜고 있습니다.
클라쪽에서 GetCurrentProcessID를 가지고 PID를 구했는데요
서버에서 이 PID를 가지고 프로세스가 존재하는지 체크하려고 합니다.
목적은 클라이언트 프로세스가 죽었을 때 서버에서 확인하려 하는데요.
atexit로 죽었다고 패킷 보내는 것도 생각했었는데,
메인이 먼저 죽고 실행되는거라 소켓이 없어져서 통신이 안될 것 같은데 맞는건가요
관련 함수나 방법 있으면 조언 부탁드립니다
Forums:


프로세스가 존재하는지 체크 => 다른 방법으로 구현은
프로세스가 존재하는지 체크 => 다른 방법으로 구현은 어떤가요
- 클라에서 쓰레드 하나 생성 후 주기적으로 서버에 사전에 정의된 패킷을 보낸다던가.
- C++의 경우 RAII 기법 이용, 메인이 죽을 때 소멸자 이용해서 패킷 전송
(atexit와 유사하지만 소켓등의 자원등에 대해서 자원해제 순서를 지정할 수 있으니)
class DeadHandler { public:
class DeadHandler { public: DeadHandler(const int &udp_socket); ~DeadHandler(); // 여기서 서버에 패킷 전송 루틴 작성 private: const int & m_upd_socket; }; int main() { int udp_socket; DeadHandler dead_handler(udp_socket); // 메인이 죽었을 때 // 지역변수는 dead_handler, udp_socket 순으로 // 할당해제 된다. // 따라서 DeadHandler객체의 소멸자에 의해 서버에 패킷 전송 가능 };후자의 경우 이런식으로 짤 수 있을 것 같네요
프로세스가 정상적으로 종료되지 않고 '죽는 경우'에는
프로세스가 정상적으로 종료되지 않고 '죽는 경우'에는 소멸자의 호출이 보장되지 않습니다. 보통은 호출되지 않습니다.
아.. 여태껏 잘못알고 있었군요
소멸자 호출이 보장되는것으로 알고있었습니다.
지적 감사합니다.
그렇다면..
출처 : http://www.cs.ucr.edu/~kishore/cs153/signals.c
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/multi_process
두개 짜깁기 + 주석 직접 작성함.
#include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> #include <unistd.h> /* 적당히 udp 소켓 생성함 */ int g_socket_upd; void signalHandler(int signal) { /* 자식 프로세스가 죽었을 때 취해야 할 루틴 작성 */ } int main() { /* 자식 프로세스 중 하나라도 비정상적으로 끝난 경우 등록한 핸들러가 호출 됨. */ signal(SIGCHLD,signalHandler); int pid; pid = fork(); if (pid > 0) { printf("부모 프로세스\n"); /* 부모 프로세스는 단지 핸들러 호출을 위한 프로세스 임. */ waitpid(pid); } else if (pid == 0) { printf("자식 프로세스\n"); /* 실제 모든 작업은 자식 프로세스에서 진행 */ pause(); } else if (pid == -1) { perror("fork error : "); exit(0); } return 0; }이건 어떤가요? 커널이 죽지 않는 이상, 프로세스가 종료되었을 때
클라가 서버에 정상적으로 메세지를 전달 할 수 있을것 같은데요.
...
이렇게 하면 프로세스가 종료되었을 때 "매우 많은 경우" 메시지를 전달할 수는 있겠습니다만, 100% 보장은 안됩니다.
생각해 보면 당연한 얘기죠. 누가 랜선 뽑고 전원 내려버리면 어떻게 하겠습니까.
따라서 서버 입장에서 보면 "프로세스 종료" 메시지를 받을 경우 뭔가 좀 더 효율적인 처리를 할 수는 있겠지만, 그건 그냥 운이 좋은 케이스일 뿐이지 재수없으면 클라이언트는 언제든지 소리없이 죽을 수 있다고 가정하고 프로그램을 짜야 합니다.
답변이 늦었습니다!
fork를 한번 써봐야겠네요ㅎㅎ
제가 찾아봐야 하는데 출처 남겨주셔서 감사합니다.
댓글 달기