그룹 ID가 1인 하위 항목에 대해 waitpid 사용

그룹 ID가 1인 하위 항목에 대해 waitpid 사용

많이 검색했지만 해결책을 찾지 못했습니다. 그러니 이것은 어리석은 질문일 수도 있다.

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를 갖게 됩니다.

관련 정보