fork에 관한 질문입니다.

shs0917의 이미지

아래 소스는 패킷을 캡쳐하고 캡쳐하는 순간마다 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);
}
alsong의 이미지

   if(pcap_loop(pd, 0, Create_Detector, NULL) < 0){ 
      (void)fprintf(stderr, "pcap_loop: %s\n", pcap_geterr(pd)); 
      exit(1); 
   } 

언뜻보기에는 종료 되어야 할거 같은데 pcap_loop의 작동이 궁금하군요.
pcap_loop에 무한루프 코드가 있어서 종료가 안되는건지도
질문의 요지를 이해하지 못하겠습니다.

그냥 포크라면
fork()의 리턴값에 따라 자식또는 부모 프로세스를 인지할 수 있습니다.

if(fork() == 0) 
{
  //자식프로세스가 해야할일
} else {
  //부모프로세스가 해야할일
}

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

shs0917의 이미지

실행되면 데몬 흉내를 내기 위해서 패킷 캡쳐를 저런 식으로 프로세스를 만들구요.. 뭐.. 종료가 제대로 안되는건... 무한루프 부분을 확인 해봐야 겠군요..
그것보단 loop함수가 무한 루프를 돌면서 패킷을 캡쳐해서 캡쳐가 되는 순간
Create_Detector를 처리 함수로써 작동 시키는데요.. Create_Detector가
Detector 함수를 패킷캡쳐의 자식 프로세스로 생성 시켜주도록 하고 싶은거죠.. 물론 한번에 생성할 수 있는 Detector의 최대값은 미리 정해놔야
fork폭탄같은 불상사는 막을 수 있겠죠...
제가 설명이 서툴러서..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

maidland의 이미지

아.. 이 글을 보는중 의문이 생기네요..

while(1)
    {
       sleep(2);
    } 

이 부분은 무슨 역활을 하죠?

while문으로 sleep(2)을 무한Loop시킨다..

무슨 의미죵?

>> http://ragnarok.co.kr <<

라그온+ㅁ+ 댄서는 아직 죽지 않았다!!
=-=-=-=-=-=-=-=-=-=-=-

mach의 이미지

maidland wrote:
아.. 이 글을 보는중 의문이 생기네요..

while(1)
    {
       sleep(2);
    } 

이 부분은 무슨 역활을 하죠?

while문으로 sleep(2)을 무한Loop시킨다..

무슨 의미죵?


busy wait를 피하기 위함입니다. 만일 다음과 같이 쓴다면,
while(1)
{
// cpu시간을 점유함, 엄청나게 점유
}

그래서, 다음과 같은 형태로 코딩하기도 합니다.
while(1)
{
pause();// CPU를 점유하지 않음, 시그널이 발생할때까지 슬립(sleep)상태로 빠짐
}

sleep(2)를 사용하는것 보다는 pause()를 사용하는게 더 좋은(CPU점유를 덜하는) 코드입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

maidland의 이미지

정말 궁금했던 부분인데..

감사합니다...

좋은 하루 되세요.. :shock:

>> http://ragnarok.co.kr <<

라그온+ㅁ+ 댄서는 아직 죽지 않았다!!
=-=-=-=-=-=-=-=-=-=-=-

shs0917의 이미지

패킷 캡쳐를 프로세스로 올리는데 패킷이 엄청난 속도로 들어오기 때문에..
사실상의 프로세스 대기시간은 없을듯 하군요.. 실제 테스트에서도
위의 코드가 빠져도 별 문제가 없었구.. 하지만 명확하게 코딩하는게 좋겠죠?
랜선이 빠졌다거나.. 네트워크 장애로 패킷을 받지 못하는 불상사가 생길 수
있으니.. 그때는 저 부분이 효과가 있겠군요..
그럼 오늘도 즐거운 하루 되세요~

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.