답변:
Linux에서는 모든 프로세스에 다음과 같은 여러 ID가 연결되어 있습니다.
프로세스 ID (PID)
프로세스를 식별하는 임의의 숫자입니다. 모든 프로세스에는 고유 한 ID가 있지만 프로세스가 종료되고 상위 프로세스가 종료 상태를 검색 한 후 새 프로세스에서 프로세스 ID를 재사용 할 수 있습니다.
상위 프로세스 ID (PPID)
이것은 해당 프로세스를 시작한 프로세스의 PID 일뿐입니다.
프로세스 그룹 ID (PGID)
프로세스 그룹 리더의 PID 일뿐입니다. PID == PGID 인 경우이 프로세스는 프로세스 그룹 리더입니다.
세션 ID (SID)
세션 리더의 PID 일뿐입니다. PID == SID 인 경우이 프로세스는 세션 리더입니다.
세션과 프로세스 그룹은 여러 관련 프로세스를 하나의 단위로 취급하는 방법 일뿐입니다. 프로세스 그룹의 모든 구성원은 항상 동일한 세션에 속하지만 한 세션에는 여러 프로세스 그룹이있을 수 있습니다.
일반적으로 셸은 세션 리더가되고 해당 셸에서 실행되는 모든 파이프 라인은 프로세스 그룹이됩니다. 이것은 쉘이 종료 될 때 자식을 쉽게 죽일 수 있도록하기위한 것입니다. 자세한 내용은 exit (3) 를 참조하십시오.
나는 리더가 아닌 세션 또는 프로세스 그룹의 구성원에 대한 특별한 용어가 없다고 생각합니다.
세션 리더는 세션 ID == 프로세스 ID 인 프로세스입니다. 이것은 생각되는 것처럼 들리지만 세션 ID는 자식 프로세스에 의해 상속됩니다. UNIX / Linux 내의 일부 작업은 프로세스 세션에서 작동합니다 (예 : kill 시스템 호출 또는 명령으로 보낼 때 프로세스 ID 무시). 가장 일반적인 용도는 쉘에서 로그 아웃 할 때입니다. OS kill -HUP -$$
는를 보내고 , 이것은 쉘과 동일한 세션 ID를 가진 모든 프로세스에 SIGHUP (hangup) 신호를 보냅니다. 프로세스를 제거하면 프로세스의 세션 ID가 셸에서 변경되므로 행업 신호에 응답하지 않습니다. 이것은 데몬 프로세스가되는 프로세스의 일부입니다.
창 관리자 / 그래픽 환경에서 호출 된 대부분의 프로세스는 시작 프로그램 중 하나와 동일한 세션 ID를 갖습니다. 이를 통해 OS는 kill -HUP -$$
브라우저, 음악 플레이어, libreoffice, IM 클라이언트 등과 같은 모든 프로그램 에서 동일한 작업 을 수행 할 수 있습니다 . 이들은 세션 리더가 아닌 프로세스입니다.
나는 이것에 대한 답을 알고 있다고 생각했지만 이것을 이해하기 위해 C 프로그램을 작성했습니다.
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t sid, mypid, pgid, gid;
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
if (!fork())
{
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("child PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
_exit(0);
}
return 0;
}
나는 cc -g -o sid sid.c
몇 가지 다른 방법으로 그것을 실행하여 어떤 일이 일어나는지 보았습니다.
./sid
nohup ./sid > sid.out
setsid ./sid
나는 리눅스 (2.6.39)가 돌려 준 것에 놀랐다. 또한 섹션 7 매뉴얼 페이지 "자격 증명"을 찾았습니다.
내 조언은 man 7 credentials
(또는 Linux가 아닌 경우 동등한 것) 프로세스 그룹 및 세션에 대한 섹션을 읽고 퍼즐을 풀 수 있는지 확인하는 것입니다.
./sid
및 nohup ./sid
을 실행할 때 setsid ./sid
세션 ID (SID)는 아주 새롭고 프로세스 PID와 같습니다. 왜 nohup이 포크를 막았는지 (또는 것 같습니다) 모르겠지만, 일반적인 아이디어를 가지고 있다고 생각합니다 ...
ps xao pid,ppid,pgid,sid,comm
이 ID를 보려면 사용하십시오 .