[C] 간단한 fork 예제 및 fork 이론
2022. 4. 20. 23:35# ps fo user,pid,pgid,cmd | grep <실행한 파일 이름>
(e.g.)
# ps fo user,pid,pgid,cmd | grep a.out
소스코드 1. fork로 자식프로세스 생성 후 종료
- test.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid;
// 이 때, 부모는 fork는 자식프로세스의 pid를 반환한다
// 자식은 pid 값이 0으로 된다.
pid = fork();
if (pid > 0) { // 부모 코드
printf("부모 PID : %ld, pid : %d\n",(long)getpid(), pid);
}
else if (pid == 0) { // 자식 코드
printf("자식 PID : %ld\n",(long)getpid());
}
else {
// 생성 실패
printf("fork Fail\n");
return -1;
}
return 0;
}
소스코드 2. fork로 프로세스 생성 후, 계속 실행
- test_while.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid;
// 이 때, 부모는 fork는 자식프로세스의 pid를 반환한다
// 자식은 pid 값이 0으로 된다.
pid = fork();
if (pid > 0) { // 부모 코드
printf("부모 PID : %ld, pid : %d, pgid: %ld\n",(long)getpid(), pid, (long)getpgid(pid));
while(1) {
sleep(1);
}
printf("부모 끝");
}
else if (pid == 0) { // 자식 코드
printf("자식 PID : %ld, pgid: %ld\n",(long)getpid(), (long)getpgid((long)getpid()));
while (1) {
sleep(1);
}
printf("자식 끝");
}
else {
// 생성 실패
printf("fork Fail\n");
return -1;
}
return 0;
}
결과화면
소스코드 3. setpgid활용해서 자식프로세스 그룹 변경하기
https://unix.stackexchange.com/questions/404054/how-is-a-process-group-id-set
- test_while_pgid.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid;
// 이 때, 부모는 fork는 자식프로세스의 pid를 반환한다
// 자식은 pid 값이 0으로 된다.
pid = fork();
if (pid > 0) { // 부모 코드
printf("부모 PID : %ld, pid : %d, pgid: %ld\n",(long)getpid(), pid, (long)getpgid(pid));
while(1) {
sleep(1);
}
printf("부모 끝");
}
else if (pid == 0) { // 자식 코드
setpgid((long)getpid(), (long)getpid());
printf("자식 PID : %ld, pgid: %ld\n",(long)getpid(), (long)getpgid((long)getpid()));
while (1) {
sleep(1);
}
printf("자식 끝");
}
else {
// 생성 실패
printf("fork Fail\n");
return -1;
}
return 0;
}
결과화면
자세히보면, 자식 프로세스 그룹ID가, 자식 프로세스 ID로 변경이 된 걸 확인할 수 있다. 보통, 자식 프로세스가 생성되면, 자식 프로세스의 그룹ID는 부모 프로세스 그룹 ID와 같게 된다. (소스코드 2의 예시를 보시면 됩니다.)
하지만, setpgid를 활용하면, 자식 프로세스의 그룹 ID를 변경할 수 있다.
이름
setpgid, getpgid, setpgrp, getpgrp - 프로세스 그룹을 설정하거나 알아낸다.
사용법#include unistd.h>
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
int setpgrp(void);
pid_t getpgrp(void);
이론
fork는 새 프로세스를 만드는 시스템 콜(호출)이다. 새로 생성된 프로세스(=자식 프로세스)는 몇 가지를 제외하고는, 호출자 프로세스(=부모 프로세스)와 동일합니다.
- 자식 프로세스는 고유한 프로세스 ID를 가집니다.
- 자식 프로세스는 고유의 메모리 공간을 가집니다.
- 자식 프로세스는 부모 프로세스의 file descriptor의 복사본을 가집니다. 부모와 자식 프로세스의 file descriptor는 같은 파일을 가리킵니다.
프로세스 ID 와 프로세스 그룹은
https://blog.potados.com/dev/things-happend-after-fork/
참고자료/출처
'C > Code snippet' 카테고리의 다른 글
[C] 파일 읽기 간단한 예제 (0) | 2022.05.02 |
---|---|
[C] argc와 argv의 관계 (0) | 2022.04.30 |
[C] 로그 파일명, 함수명, 라인 출력 (0) | 2022.04.08 |
[C] 콘솔 커서를 이동하는 함수 (0) | 2022.01.23 |
오픈소스에서 조각 쓰는 데이터들 chunk (수정중) (0) | 2021.12.23 |