ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 라이브러리를 활용한 Linux 제어 - 프로세스(exec)
    Linux 2020. 4. 23. 22:10

    앞서 언급했던 fork와 같이 프로세스 자원 관리를 하는데 있어 쓰이는 exec...함수에 대해 포스팅 하고자 한다.

    fork는 원래 프로세스에서 자식 프로세스를 생성하고 그것을 병렬적으로 사용한다.

    exec는 자식 프로세스를 본래 코드에서 의도했던 방향과는 아예 다른 프로세스를 형성하기도 하지만

    오류나 특이점이 생긴 본 코드에서도 프로세스를 관리해주는 역할을 할수도 있다.

     

     

    위의 그림같은 상황을 생각해보자.

    fork()를 통해 두가지 프로세스를 생성했다.

    그리고나서 자식프로세스를 미리 생성해둔 실행프로그램인 fork를 실행하게 두었다.

    이 경우에는 사실 기본적으로는 잘못된 방법이다.(이유는 후술 할것이다.)

    어찌 돼었든, 자식 프로세스는 기존의 부모 프로세스와는 전혀 다른 액션을 하는 fork실행 파일의 액션을 취한다.

    이런식으로 exec 를 사용하게 되면 기존의 프로세스를 완전히 새로운 프로세스로 탈바꿈시킬수 있다.

    이제 하나 정리를 해보자면

    Exec프로세스가 실행 된 뒤 실행중인 프로세스를 다른 특정 프로세스로 대치시키고자 할때 사용하는 함수 군(Family)라고 할수있다. exec()은 이 함수 그룹을 대표하는 이름이다.
    execl실행 파일의 경로와 인수들의 나열, 마지막에 null을 세팅한다. execl("경로", "~~인자 들", (char *)0);
    execv실행 파일 경로와 인수들의 배열을 사용한다. execv(path, argv);
    execlp파일의 이름과 인수들의 나열, 그리고 마지막에 null을 세팅한다. execlp(file, arg...., (char*)0);
    execvp파일 이름, 인수들의 배열을 사용한다. execv(file, argv);

     

     

    - 후술 -

    앞서 언급한 코드는 사실 잘못된 코드다

    이유는, 부모 프로세스는 자식 프로세스보다 일찍 죽으면 안되기 때문이다

     

     

    만약 부모 프로세스가 먼저 죽게되면 자식 프로세스는 끝나지 않게된다.

    그렇기 때문에 부모 프로세스는 끝나더라도, 자식 프로세스가 끝날때까지 대기상태로 있어야한다.

    이때, fork에서 언급한 wait함수를 통해 문제를 해결할수 있다.

     

     

    위와 같이 헤더를 지정해줘야 wait함수를 쓸수있다.

    사실 컴파일 해보고 안되는 내장함수들은 터미널에

    man 내장함수 이름

    을 써보길 바란다.

    어찌 되었든 저런식으로 내장함수를 사용할수 있게 환경을 설정하고

     

     

    위와 같이 wait함수를 pid 가 0보다 큰 부모 프로세스에서

    쓰게 되면, 자식 프로세스가 끝날 때 까지 기다리게되고

     

     

    와 같이 제대로 시작과 끝을 확인할수 있다.

     

    'Linux' 카테고리의 다른 글

    C언어 라이브러리를 활용한 Linux 제어 - 프로세스(fork)  (0) 2020.04.23

    댓글

Designed by Tistory.