줘이리의 인생적기

프로세스 ID, 프로세스 생성 본문

공부/시스템 프로그래밍

프로세스 ID, 프로세스 생성

줘이리 2021. 12. 15. 23:00
728x90

프로세스 ID

 - 각 프로세스는 각 pid를 가지며, 최대값은 32768이다.

 - sudo vi /proc/sys/kernel/pid_max 에서 최대값을 확인할 수 있음.

 

프로세스 계층

 - 최초 프로세스는 init 프로세스 이며 pid는 1이다.

 - 운영체제가 init프로세스를 생성한다.

 - 다른 프로세스는 init프로세스를 기반으로 생성된다.

 - ppid는 부모프로세스의 pid를 뜻한다.

 

소유자 관리

 - 리눅스는 프로세스의 소유자와 그룹을 UID/GID 정수로 관리하며 서로 매핑되어 있다.

 - sudo vi /etc/passwd 에서 확인할 수 있다.

 

 

PID 호출 함수

 - getpid(), getppid()로 알 수 있다.

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    printf("pid=%d \n", getpid());
    printf("ppid=%d \n", getppid());
    return 0;
}

 - 코드 작성 후 gcc -o 파일이름.c 실행파일이름 로 컴파일

 - ./실행파일이름 으로 실행

 

 


프로세스 생성

 - code, data, bss, heap, stack 공간을 생성한다.

 - 프로세스 이미지 해당 공간에 업로드.

 - 실행

 

fork() 시스템콜

 - fork()를 실행하면 프로세스 공간을 만들고, 프로세스의 모든 공간의 데이터를 복사한다.

 - #include <unistd.h> 헤더파일을 포함해야 한다.

 - pid_t fork(void) 가 함수원형이다.

 - pid = fork()가 실행되면 별도 메모리 공간에 자식 프로세스가 생성되며, 자식 프로세스는 pid가 0으로 리턴된다.

 - 부모 자식 프로세스의 변수 및 PC 값이 동일하다.

 

exec() 시스템콜

 - exec()를 실행하면 새로운 프로세스를 만드는 것이 아니라, code, data, bss 영역을 새로운 프로세스의 이미지로 덮어씌운다. 

 - exec() 시스템콜은 6가지가 있다.

 - 제일 대표적인 시스템콜 중 하나는 execl() 시스템콜

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    execl("/bin/ls", "ls". "-l", NULL); 
    //정상적으로 execl이 실행된다면 아래 코드는 실행이 안됨
    perror("execl is failed \n"); //에러출력 
    exit(1); // 에러코드 전달
}

 - 첫번째 인자는 실행파일명, 두번째 인자부터는 arg인수 목록 넣으면 된다.

 - execlp()는 path값을 참조하여 실행하겠다는 시스템콜이어서 첫 번째 인자에 실행파일명만 넣으면 된다.

execlp("ls", "ls", "-l", NULL);

 - execle()는 path값을 따로 설정을 하여 참조해주어야 한다.

char *envp[] = {"USER=user", "PATH=/bin", (char *)0};
execle("ls", "ls", "-al", NULL, envp);

 - perror() 함수가 호출된다는 것은 프로세스 이미지 덮어씌우는 작업이 실행되지 못했다는 의미이다.