vfork와 kill.
글쓴이: vyoz / 작성시간: 일, 2008/02/17 - 4:49오후
안녕하세요. 현재 셋탑에 pppoe를 올리는 삽질을 하고 있습니다.
셋탑에 pppd와 rp-pppoe를 올려서 작업을 진행중인데 어려운 상황이 발생해서
조언을 듣고자 글올립니다.
현재 구조는 셋탑의 GUI에서 다음과 같은 펑션으로 pppoe-start (rp-pppoe에 포함)
스크립트를 실행시켜 접속하도록 돼있습니다.
static int run_script(const char *script, char **envs) { int pid, n, status; char *shell = "/bin/sh"; pid = vfork(); if (pid == 0) { execle(shell, shell, "-c", script, NULL, envs); exit(1); } _wait_: n = ::waitpid (-1, &status, WNOHANG); if (n != pid) { struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 100000; /* 0.1s */ select (0, NULL, NULL, NULL, &tv); goto _wait_; } if (WEXITSTATUS (status) != 0) return -1; return status; } run_script( "/usr/sbin/pppoe-start", NULL);
문제는 이 방식으로 접속할 경우 "pppoe-stop" 스크립트로 접속을 끊을 때
엉뚱한 녀석이 같이 죽는 문제가 있다는 것입니다.
pppoe-stop은 kill 명령으로 pppd를 죽이는데 kill의 옵션으로 -9를 주면
위 문제가 발생하지 않습니다.
문제를 임시 땜빵으로 해결은 했는데 정확한 원인은 못찾아낸 격입니다.
문제의 원인을 알고싶고 진단 방법을 알고싶습니다.
Forums:
댓글 달기