본문 바로가기

컴퓨터공학/시스템 프로그래밍

시스템콜 , 프로세스 생성

반응형

프로세스 id 가져오기, 부모프로세스 id 가져오기 (응용프로그램 - API - 커널)

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

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

 

기본 프로세스 생성 과정

1. 공간을 잡는다

2. CODE, DATA, BSS 공간을 잡는다 (프로세스 이미지 업로드)

3. 실행하여 STACK, HEAP이 할당된다

 

 

fork() 시스템콜

부모와 동일한 별도의 자식 프로세스를 생성하고 PC레지스터는 부모와 자식 프로세스는 다음 주소로 간다

 

fork()를 실행한 뒤에 자식프로세스가 생기므로 프로세스는 2개가 되고 자식 프로세스의 pid는 0이고, 부모 프로세스는 그대로 유지된다. 고로 Parent process, Child process 두 개의 출력 결과를 볼 수 있다.

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
    pid_t pid;
    printf("Before fork() call\n");
    pid = fork();

    if (pid == 0)
        printf("This is Child process. PID is %d\n", pid);
    else if (pid > 0)
        printf("This is Parent process. PID is %d\n", pid);
    else
        printf("fork() is failed\n");

    return 0;
}


exec() 시스템콜

현재 프로세스 공간에 BSS,CODE,DATA를 새로운 프로세스로 덮어씌운다. 별도의 공간은 생성하지 않는다.

  • execl
  • execlp
  • execle
함수명 사용법
execl

int execl(const char *path, const char *arg, ...)

* execl(실행파일 전체경로, 전달할 인자1, 전달할 인자2)

execlp

int execl(const char *file, const char *arg, ...)

* execlp("ls","ls","-al",NULL)

execle

int execle(const char *file, char *arg, .., char * const envp[])

*char *envp[] = {"USER=dave", "PATH=/bin", (char *)0}

execle("ls","ls", "-al", NULL, envp)

execv

int execv(const char *path, char *const argv[])

*char *arg[] = {"ls", "-al", NULL}

execv("\bin\ls", arg}

execvp

int execvp(const char *file, char *const argv[])

*char *arg[] = {"ls", "-al", NULL}

execv("ls", arg}

execvpe

int execvpe(const char *file, char *const argv[], char *const envp[])

*char *envp[] = {"USER=dave", "PATH=\bin", (char *)0}

char *arg[] = {"ls", "-al", NULL}

execv("ls", arg, envp}

execl의 사용예를 설명하면

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

int main(){
        printf("execute ls\n");
        execl("/bin/ls","ls","-l",NULL);
        perror("execl is failed\n");
        exit(1);
        return 0;
}

execl을 실행하여 code, data, bss 영역이 바뀌게 되면 /bin/ls를 실행하는 프로세스로 바뀌게 되므로 perror 문장을 실행하지 않게 된다.

 

 

반응형