프로세스의 여러 ID - whdlgp/system_programming_pra GitHub Wiki
PID
프로세스 자신의 고유한 ID다
PPID(부모 프로세스의 PID)
fork 를 통해 부모 프로세스 자식 프로세스가 생겼을 때, 자식프로세스의 PPID값은 부모프로세스의 PID다.
예로 부모 프로세스가 6654의 PID, 자식 프로세스의 PID가 6655라면, 자식 프로세스의 PPID는 6654가 된다.
PGID(프로새스 그룹 ID)
여러 연관된 프로세스들의 집합을 "프로세스 그룹" 이라고 한다면 그 프로세스 그룹의 ID 가 PGID 다. 각 프로세스의 PGID 를 보고, 서로 같은 PGID라면 연관성이 있는 프로세스 라고 할 수 있을 것이다.
SID(세션 ID)
프로세스 그룹들이 모여 "세션"을 이루는데, 그 세션의 ID 가 SID다. SID는 어느정도 특징이 있는데, 보통 쉘 프로그램의 ID가 SID다. 원한다면 자기가 SID를 변경하거나 해서 세션하나를 만들어 짱이 될수도 있다.
getpid()
프로세스 자신의 pid 값을 반환한다.
getppid()
프로세스 자신의 ppid 값을 반환한다.
getpgid(pid값)
인자로 넣어준 pid 값의 pgid를 반환한다. 만약 0을 인자로 넣을 경우 프로세스 자신의 pgid 값을 반환한다.
getpgrp()
프로세스 자신의 pgid 값을 반환한다.
getsid(pid값)
인자로 넣어준 pid 값의 sid를 반환한다. 만약 0을 인자로 넣을 경우 프로세스 자신의 sid 값을 반환한다.
getgpid(pid값, 변경할 pgid값)
인자로 넣어준 pid의 pgid를 변경한다.
pid 값이 0일 경우 자신의 pgid를 변경하며, 변경할 pgid 값이 0일 경우 자기 프로세스 그룹에서 짱을 먹는다.
setsid()
만약 자기가 세션 리더가 아니면, 세션을 하나 만들고 짱을 먹는다.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <wait.h>
int main(void)
{
pid_t pid;
int status;
pid = fork();
putenv("APPLE=RED");
//HOEM, SHELL, PWD : 내장환경변수, 사용자(지정) 환경변수
if(pid > 0)
{
printf("[parent] PID : %d\n", getpid());
printf("[parent] PPID : %d\n", getppid());
printf("[parent] GID : %d\n", getpgrp());
printf("[parent] SID : %d\n", getsid(0));
waitpid(pid, &status, 0);
printf("[parent] status is %d\n", status);
unsetenv("APPLE");
}
else if(pid == 0)
{
printf("[child] PID : %d\n", getpid());
printf("[child] PPID : %d\n", getppid());
printf("[child] GID : %d\n", getpgrp());
printf("[child] SID : %d\n", getsid(0));
sleep(1);
printf("[child] APPLE : %s\n", getenv("APPLE"));
exit(1);
}
else
{
printf("fail to fork!\n");
}
return 0;
}
- fork로 프로세스를 나눈다.
- 부모/자식 프로세스의 id 들을 출력한다.
- 부모는 자식의 종료가 끝날때까지 기다린다.
[parent] PID : 13350
[parent] PPID : 4019
[parent] GID : 13350
[parent] SID : 4019
[child] PID : 13351
[child] PPID : 13350
[child] GID : 13350
[child] SID : 4019
[child] APPLE : RED
[parent] status is 256
환경변수 관련 부분이 있는데, 그냥 한번 넣어본거라 신경쓰지 않아도 된다 ㅡㅡ;