UDP 통신에서의 fork.
글쓴이: 김학수 / 작성시간: 화, 2003/05/13 - 10:13오후
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 의 위치가 잘못된건지.. 아님 다른 문제가 ?
길을 보여주시면 감사하겠습니다..
Forums:
해당 프로그램을 구동한 후에 하나의 UDP packet에 대해 처리한 후
해당 프로그램을 구동한 후에 하나의 UDP packet에 대해 처리한 후에 다음 packet 부터 오류가 난다는 말씀이신지 아니면 다음 구동시에 오류가 난다는 말씀이신지 잘 모르겠군요.
udp_port_init()을 while loop 전에 호출하니 첫번째 경우는 아닐것 같은데요...
두번째 경우라면 오류가 나는 지점에서 perror()로 오류 내용을 출력해서 보여주시면 좋겠네요.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
하나의 패킷을 처리한 후 에러가 납니다.
하나의 패킷을 처리한 후..
윗단의 포트 init 하는 곳에서 계속 에러가 나는거죠..
실 프로그램에서는 프로세스가 죽으면 계속 프로세스를 재구동 시킵니다.
하지만 포트 init 하는 부분에서 계속 에러가 발생하면서 프로세스가 죽고.
계속 재구동되고 그렇죠... ㅡㅡ;;;
하나의 packet을 처리한 후에 udp_port_init()을 누가 호
하나의 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 를 하는게 좋겠군요..
간단히 프로그램을 다시 짜서 해봤는데. 잘 됩니다.
감사합니다.
댓글 달기