반응형

# 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;

 }

 

결과화면

 

 

다른 쉘 창에서 확인했을 경우. 기본적으로 부모의 pgid = 자식의 pgid 로 설정이 되어있다.

 

소스코드 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;
}

 

결과화면

 

자식과 부모의 PGID (프로세스 그룹 ID가 다르다)

 자세히보면, 자식 프로세스 그룹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);

 

출처1

 

 

이론

 fork는 새 프로세스를 만드는 시스템 콜(호출)이다. 새로 생성된 프로세스(=자식 프로세스)는 몇 가지를 제외하고는, 호출자 프로세스(=부모 프로세스)와 동일합니다.

 

  • 자식 프로세스는 고유한 프로세스 ID를 가집니다.
  • 자식 프로세스는 고유의 메모리 공간을 가집니다.
  • 자식 프로세스는 부모 프로세스의 file descriptor의 복사본을 가집니다. 부모와 자식 프로세스의 file descriptor는 같은 파일을 가리킵니다.

 프로세스 ID 와 프로세스 그룹은

 

https://blog.potados.com/dev/things-happend-after-fork/

 

참고자료/출처

https://codetravel.tistory.com/23

반응형