리눅스 프로세스 생성하기

Yeongsan Son·2021년 7월 18일
0

리눅스에서 프로세스를 생성하는 과정을 알아보기 전에, 프로세스의 기본 구조를 다시 생각해보자.

프로세스의 기본 구조는 다음과 같다.

  • TEXT : 프로세스의 정의나 명령
  • DATA : 프로그램이 사용하는 정적 변수
  • BSS : 초기화하지 않은 전역 변수나 정적 변수
  • HEAP : 프로그램이 사용하는 동적 변수
  • STACK : 함수의 호출과 반환에 따라 쌓이고, 줄어드는 메모리 공간

프로세스가 생성되면 위의 기본 구조를 갖추어 메모리에 할당되어 실행되고 프로세스는 다른 프로세스로부터 생성된다.

프로세스를 실행하는 시스템콜은 fork()exec()이 있다.

fork()는 프로세스 안에서 fork 함수가 실행되면, fork 함수를 가지고 있던 프로세스(부모)를 복사해 자식 프로세스를 생성한다.

  • 새로운 프로세스 공간이 생성
    • Before fork() call 이후부터 프로세스가 2개
      • 부모 프로세스와 자식 프로세스
      • 두 프로세스의 변수와 PC 값은 동일
    • pid 값이 0인 자식 프로세스 생성

exec()는 프로그램 실행파일을 읽어 현재 프로세스의 TEXT, DATA, BSS 영역을 새로운 프로세스의 이미지로 덮어 씌운다.

  • 프로세스 공간을 만들지 않음
  • exec() 함수의 인풋으로 실행 파일을 넣는다.
  • 함수를 실행하면 실행 파일의 TEXT, DATA, BSS 영역으로 기존 프로세스의 영역을 덮어씌운다.

또한, exec()는 내부에 6개의 함수를 가지고 있어 각기 다른 역할을 수행한다.

  • execl(): ls -al과 같은 실행 효과
    • execl("/bin/ls", "ls", "-l, NULL)
    • "ls": argv[0] => 함수의 0번 인자, ls 명령을 실행
    • "-l": argv[1] => 함수의 1번 인자, -l 옵션

  • execlp()

    • execlp("ls", "ls", "-al", NULL)
    • 경로(path)를 참조해서 실행
  • execle()

    • execle("ls", "ls", "-al", NULL, envp)
    • 환경변수를 따로 설정해서 함수의 인자로 넣어서 실행
  • execv(): execl()에서 반환된 argv 사용

    • execv("/bin/ls", arg)
  • execvp(): execlp()에서 반환된 argv 사용

    • execvp("ls", arg)
  • execve(): execle에서 반환된 argv 사용

    • execve("ls", arg, envp)
    • 환경 변수에 path를 넣지 않으면 오류가 발생한다.
    • 기존 함수의 path 경로를 참조하지 않는다.

profile
매몰되지 않는 개발자가 되자

0개의 댓글