fork에 관한 질문입니다.
글쓴이: shs0917 / 작성시간: 목, 2003/08/07 - 12:37오전
아래 소스는 패킷을 캡쳐하고 캡쳐하는 순간마다 Detect 프로세스를
생성하고 처리가 끝난 Detect프로세스는 종료 되도록.. Detect프로세스는
최대 10개 동시에 생성 가능한.. 그런걸 구현 하려고 합니다.
이걸 포크로 구현하려는데 조언 부탁 드립니다.
그리고 이거 실행하면 강제로 죽이지 않으면 안죽던데요..^^
죽여도 다시 살아나는 무적(?)의 프로세스 같은 느낌이..
그 부분에 대한 조언도 부탁 드릴께요..^^
void Packet_Capture(); void Create_Detector(); int main(int argc, char *argv[]) { pid_t pid; if(( pid = fork()) < 0) { printf("Error^^\n"); exit(0); } else if(pid != 0) { exit(0); } chdir("/"); printf("Observer Starting!!!\n"); sleep(2); Packet_Capture(); setsid(); while(1) { sleep(2); } return 0; } void Packet_Capture() { char ebuf[PCAP_ERRBUF_SIZE]; char *device_name; device_name = pcap_lookupdev(ebuf); //Network Device Find if(device_name == NULL){ fprintf(stdout, "Usage : Network Interface Error\n"); exit(0); } if((pd = pcap_open_live(device_name, DEFAULT_SNAPLEN, PROMISCUOUS, TIME_OUT, ebuf)) == NULL){ //pcap initialize (void)fprintf(stderr, "%s\n", ebuf); exit(1); } if(pcap_loop(pd, 0, Create_Detector, NULL) < 0){ (void)fprintf(stderr, "pcap_loop: %s\n", pcap_geterr(pd)); exit(1); } pcap_close(pd); exit(0); } void Create_Detector(u_char *user, const struct pcap_pkthdr *h, u_char *p) { 이부분에서 Detector()라는 함수를 Packet_Capture 함수의 자식 프로세스로 생성 하고자 합니다. Detector(user, h, p); }
Forums:
[code:1] if(pcap_loop(pd, 0, C
언뜻보기에는 종료 되어야 할거 같은데 pcap_loop의 작동이 궁금하군요.
pcap_loop에 무한루프 코드가 있어서 종료가 안되는건지도
질문의 요지를 이해하지 못하겠습니다.
그냥 포크라면
fork()의 리턴값에 따라 자식또는 부모 프로세스를 인지할 수 있습니다.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
먼저 답변 감사 합니다.
실행되면 데몬 흉내를 내기 위해서 패킷 캡쳐를 저런 식으로 프로세스를 만들구요.. 뭐.. 종료가 제대로 안되는건... 무한루프 부분을 확인 해봐야 겠군요..
그것보단 loop함수가 무한 루프를 돌면서 패킷을 캡쳐해서 캡쳐가 되는 순간
Create_Detector를 처리 함수로써 작동 시키는데요.. Create_Detector가
Detector 함수를 패킷캡쳐의 자식 프로세스로 생성 시켜주도록 하고 싶은거죠.. 물론 한번에 생성할 수 있는 Detector의 최대값은 미리 정해놔야
fork폭탄같은 불상사는 막을 수 있겠죠...
제가 설명이 서툴러서..
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
여기서 질문...
아.. 이 글을 보는중 의문이 생기네요..
이 부분은 무슨 역활을 하죠?
while문으로 sleep(2)을 무한Loop시킨다..
무슨 의미죵?
>> http://ragnarok.co.kr <<
라그온+ㅁ+ 댄서는 아직 죽지 않았다!!
=-=-=-=-=-=-=-=-=-=-=-
Re: 여기서 질문...
busy wait를 피하기 위함입니다. 만일 다음과 같이 쓴다면,
while(1)
{
// cpu시간을 점유함, 엄청나게 점유
}
그래서, 다음과 같은 형태로 코딩하기도 합니다.
while(1)
{
pause();// CPU를 점유하지 않음, 시그널이 발생할때까지 슬립(sleep)상태로 빠짐
}
sleep(2)를 사용하는것 보다는 pause()를 사용하는게 더 좋은(CPU점유를 덜하는) 코드입니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
아.. 그렇군요..
정말 궁금했던 부분인데..
감사합니다...
좋은 하루 되세요.. :shock:
>> http://ragnarok.co.kr <<
라그온+ㅁ+ 댄서는 아직 죽지 않았다!!
=-=-=-=-=-=-=-=-=-=-=-
이 프로그램에서는 아마 대기시간은 없을듯...
패킷 캡쳐를 프로세스로 올리는데 패킷이 엄청난 속도로 들어오기 때문에..
사실상의 프로세스 대기시간은 없을듯 하군요.. 실제 테스트에서도
위의 코드가 빠져도 별 문제가 없었구.. 하지만 명확하게 코딩하는게 좋겠죠?
랜선이 빠졌다거나.. 네트워크 장애로 패킷을 받지 못하는 불상사가 생길 수
있으니.. 그때는 저 부분이 효과가 있겠군요..
그럼 오늘도 즐거운 하루 되세요~
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
댓글 달기