Linux Programming Basics

[Linux Programming] Process Related API

Sara.H 2020. 6. 30. 12:33

* 금오공과대학교 전준철 교수님 리눅스 프로그래밍 수업 6강 ~ 9강 정리 

 

프로세스 생성과 종료 

fork

부모에서는 자식 PID 반환, 

자식은 0을 반환 

실패하면 -1을 반환 

 

서로 완전히 다른 프로세스가 되지만 부모 자식간의 관계는 유지된다. 

실행 환경은 부모나 자식이나 똑같다. 코드, 레지스터, 스택 등 물려받음. 

 

PC : Program Counter 

복제가 되어버려서, 완전히 다른 독립적인 프로세스로서 활동. 

 

fork() 를 하면 pid 가 두개 생성 

원하는 작업들을 분기 안에서 처리한다. 

 

exec

path 는 경로, file 은 실행 파일 

arg 는 전달 인자 리스트

argv 는 문자열 포인터 배열 형태, 반드시 마지막에 NULL문자열을 넣어야 함. 

호출 성공하면 호출한 프로세스는 종료됨.

 

ls -l subdir 과 같은 명령어를 치는 것과 같다. 

부모 자식관계가 아니라 부르는 자와 불리는 자의 관계가 된다. 

메모리 영역을 불리는 자가 차지하고, PID까지 가져간다. 

l 은 리스트 형태 인자, v는 문자 포인터 배열형태 인자. 

 

Caller 가 제거되는 것 확인. 

 

fork 는 부모를 복제, exec 는 지정한 프로그램을 실행하는 것이 목적이다. 

명령행 인자는 부모것을 그대로 사용 / 필요한 경우 새로 적용. 

fork 호출 이후부터 자식이 실행되고, exec 는 새로운 프로그램을 처음부터 수행함. 

자식과 부모 PID다르고 / 자식과 부모 PID 같다. 

 

fork 와 exec 은 보통 함께 사용된다. 

 

exit

 

atexit

exit 호출 할 때 수행할 함수. 반환값을 가질 수 없다. 

파일을 닫거나, 자식 프로세스를 회수하는 등의 작업을 한다. 

최대 32개, 역순으로 실행된다. 

 

_exit

클린업 액션이 필요 없을 경우 사용한다. 

 

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

void clean_up_action(void);

int main(void){
    pid_t pid;
    int i;
    char *arg[] = {"ls", "-l", "home/g2", NULL};

    for(i = 0; i <3; i++){
        printf("before fork [%d]\n", i);
        sleep(1);
    }
    pid = fork();

    if(pid >0){
        for(; i <7; i++){
            printf("parent [%d]\n", i);
            sleep(1);
        }
        atexit(clean_up_action);
    }else if(pid == 0){
        for(; i <5; i++){
            printf("child [%d]\n", i);
            sleep(1);
            execv("/bin/ls", arg);
        }
    }else{
        printf("fail to fork child process \n");

    }
    exit(0);
    return 0;
}

void clean_up_action(void){
    printf("clean up action!\n");
}

출력 결과

자식 프로세스는 3, 4 를 찍어야 하는데, execv 를 하면 4는 찍히지 못한 채 종료되고, 새로운 프로그램이 실행된다. 

 

 

'Linux Programming Basics' 카테고리의 다른 글

gcc / gdb / make  (0) 2020.07.03
Shell 사용하기  (0) 2020.07.03
[Linux Programming ] File Related API  (0) 2020.06.28
Linux : File Management Commands  (0) 2020.06.28
Linux : Command Environment  (0) 2020.06.28