UDP 통신에서의 fork.

김학수의 이미지

udp 통신 프로그램을 짜고 있습니다...
데이터를 받은 후 fork 를 하여 받은 데이터를 처리하고.. 처리하는 동안
새로오는 데이터도 물론 처리를 해야겠죠..

제가 만드는 대략적인 소스입니다..
여러가지를 빼서 간단하게 추리다 보니 이해가 안되는 부분이 있을지 모르나
대충 아 이렇게 흘러가는구나 하는 정도는 아시리라 믿습니당..

#include "all.h"

int task_no;
int sun_sock;
int web_serial;


main()
{
  int ret;
  int Pid;
  char rbuf[512];
  int len;
  int cli_len;                    /* for udp socket */
  struct  	sockaddr_in clie_addr;
  int tport = 8888;
  char  msg[512];

  sleep(5);

  ret = udp_port_init(&sun_sock, tport);

  if(ret < 0) printf("UDP Port [%d] Init Error" , tport);
        
  while(1)
  {
        len = recvfrom(sun_sock, rbuf, sizeof(rbuf), 0, (struct sockaddr *)&clie_addr, &cli_len);
         if(len > 0)
         {
	Pid = fork();
	if (Pid == 0)
 	{
	      Child_Proc(rbuf);
	}
	else
	{
	    printf("Fork Error");
	}
          }
     }
}


Child_Proc(char *buf)
{
     printf ("자식 프로세스 처리합니다...");
     /* 버퍼 가지구 이리볶구 저리볶구.... */	
}

위와 같은 방식으로 하는데.. 컴파일을 시켜서 돌려보니
처음 받은 데이터를 처리한 다음 계속 udp port init 에러가 납니다.

뭔가 잘못된게 확실한데...
어떻게 처리를 해야 하나요?

fork 의 위치가 잘못된건지.. 아님 다른 문제가 ?

길을 보여주시면 감사하겠습니다..

stoneshim의 이미지

해당 프로그램을 구동한 후에 하나의 UDP packet에 대해 처리한 후에 다음 packet 부터 오류가 난다는 말씀이신지 아니면 다음 구동시에 오류가 난다는 말씀이신지 잘 모르겠군요.

udp_port_init()을 while loop 전에 호출하니 첫번째 경우는 아닐것 같은데요...

두번째 경우라면 오류가 나는 지점에서 perror()로 오류 내용을 출력해서 보여주시면 좋겠네요.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

김학수의 이미지

하나의 패킷을 처리한 후..

윗단의 포트 init 하는 곳에서 계속 에러가 나는거죠..

실 프로그램에서는 프로세스가 죽으면 계속 프로세스를 재구동 시킵니다.
하지만 포트 init 하는 부분에서 계속 에러가 발생하면서 프로세스가 죽고.
계속 재구동되고 그렇죠... ㅡㅡ;;;

stoneshim의 이미지

하나의 packet을 처리한 후에 udp_port_init()을 누가 호출하죠?
parent process는 while loop 안에서 계속 recvfrom() 하고 있는것 아닌가요?

설마 child 가???

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

용가리의 이미지

안녕하세요.....

제가 소스를 대충 보니 문제가 있긴 있는것 같네요...
지금 while() 문 안에서 recvfrom()을 호출하고 그 다음에
자식 프로세스를 생성하잖습니까....
그럼 자식이 수신한 데이터를 처리하고 나면 어떻게 되겠습니까?
당연히 while() 문 안의 recvfrom() 부터 자식이 또 처리할려고
하지 않습니까.....
그럼 또 fork()를 수행할테고.....
그럼 프로세스가 계속 생성되어 최종적으로는 더이상 프로세스를
생성할 수 없을때까지 일이 진행 되겠지요.....
그러니까 자식 프로세스는 다음 부분에서 break로 빠져
나가는 루틴을 추가한 후 해보십시오.

while (1) {
어쩌고저쩌고;
pid = fork(); ==> 또 fork()를 수행하네요...
if (Pid == 0)
{
Child_Proc(rbuf);
break; ==> 이 부분이 있어야 다시 recvfrom을 안하죠!
}

김학수의 이미지

fork 다음에 break 를 하는게 좋겠군요..
간단히 프로그램을 다시 짜서 해봤는데. 잘 됩니다.

감사합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.