vfork와 kill.

vyoz의 이미지

안녕하세요. 현재 셋탑에 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를 주면
위 문제가 발생하지 않습니다.

문제를 임시 땜빵으로 해결은 했는데 정확한 원인은 못찾아낸 격입니다.

문제의 원인을 알고싶고 진단 방법을 알고싶습니다.