많이 검색했지만 해결책을 찾지 못했습니다. 그러니 이것은 어리석은 질문일 수도 있다.
waitpid의 형식은 다음과 같습니다.
pid_t waitpid (pid_t pid, int *status, int options)
pid 매개변수는 대기할 프로세스를 정확하게 지정합니다. 그 가치는 네 가지 캠프로 나뉩니다.
< -1
Wait for any child process whose process group ID is equal to the absolute value of this value.
-1
Wait for any child process. This is the same behavior as wait( ).
0
Wait for any child process that belongs to the same process group as the calling process.
> 0
Wait for any child process whose pid is exactly the value provided.
이제 문제는 부모와 자식의 그룹 ID가 다르고 자식의 그룹 ID가 1인 경우 어떻게 될까요? 이 특정 어린이에 대해 waitpid를 어떻게 사용할 수 있습니까? -1을 사용할 수 없기 때문에 자식을 기다리라고 지시합니다.
답변1
프로세스의 하위 항목만 기다릴 수 있습니다.
하위 프로세스가 프로세스 그룹 ID를 변경하는 경우 새 프로세스 그룹 ID는 와 함께 음수로 사용될 수 있습니다 waitpid()
.
참고: 이 기능은 waitpid()
1989년부터 더 이상 사용되지 않습니다. 최신 기능은 다음과 같습니다. waitid()
즐겨찾는 기능을 지원합니다.
waitid(idtype, id, infop, opts)
idtype_t idtype;
id_t id;
siginfo_t *infop; /* Must be != NULL */
int opts;
프로세스 그룹을 기다리려면 다음을 사용하십시오.
waitid(P_PGID, pgid, infop, opts);
따라서 실제로 프로세스 그룹 ID 1에 프로세스가 있는 경우 다음을 호출하세요.
waitid(P_PGID, 1, infop, opts);
하지만 이 프로세스 그룹 ID는 이미 사용 중이기 때문에 pgid 1 아래에 자식 프로세스를 가지려면 init
해당 프로세스가 필요합니다 .init
그러나 waitid()
시스템 호출로 구현되지 않고 더 이상 사용되지 않는 waitpid()
.
장점 waitid()
은 다음과 같습니다.
무엇을 기다릴지 명시적으로 지정 가능(예: P_PID P_PGID P_ALL)
하위 프로세스에 있는 매개변수의 32비트를 모두
exit(2)
상위 프로세스로 반환합니다.플래그 대기 허용:
WNOWAIT
하위 프로세스는 수집되지 않으며 나중에 사용할 수 있도록 프로세스 테이블에 남아 있습니다.
참고: siginfo_t 포인터는 waitid()
신호 처리 함수의 두 번째 매개변수와 동일합니다 SIGCHLD
.
답변2
하위 프로세스의 프로세스 그룹 ID가 이면 몇 가지 문제가 발생합니다 1
.
프로세스 그룹은 주로 포그라운드 및 백그라운드 프로세스(파이프)를 실행하는 셸에 사용됩니다. 일반적으로 새 프로세스 그룹이 시작되면 첫 번째 프로세스의 프로세스 ID에서 프로세스 그룹 ID를 가져옵니다. PID 1의 자식을 얻지 못하므로 PGID 1의 자식도 얻지 못합니다.
이 setpgid()
호출을 통해 프로세스를 한 프로세스 그룹에서 다른 프로세스 그룹으로 이동할 수 있지만 여전히 동일한(로그인) 세션의 일부여야 하므로 이 방법으로도 프로세스를 PGID 1로 이동할 수 없습니다.
PID 1로 실행되는 쉘이 있다면 아마도 PGID 1도 있을 것입니다. 그러나 쉘이 자식의 PGID를 변경할 때마다 다른 PGID를 갖게 됩니다.