programing

포크와 exec의 차이점

copysource 2022. 9. 15. 23:48
반응형

포크와 exec의 차이점

fork ★★★★★★★★★★★★★★★★★」exec

「 」의 fork ★★★★★★★★★★★★★★★★★」exec는 UNIX가 새로운 프로세스를 시작하는 매우 간단한 방법을 제공한다는 점에서 UNIX의 정신을 보여줍니다.

forkcall은 기본적으로 현재의 프로세스를 거의 모든 에서 복제합니다.모든 것이 복사되는 것은 아니지만(예를 들어 일부 구현에서는 리소스 제한) 가능한 한 가까운 복사본을 만드는 것이 좋습니다.

새로운 프로세스(자녀)는 다른 프로세스 ID(PID)를 취득하여 오래된 프로세스(부모)의 PID를 부모 PID(PPID)로 합니다. 두 는 완전히 코드를 하고 있기 에 어느 인지 알 수 .fork0을 얻고 . - 0 PID는 0입니다.다입니다.fork콜이 기능합니다.기능하지 않을 경우 자녀는 생성되지 않고 부모에게 에러 코드가 표시됩니다.

exec으로 현재 를 새로운 입니다.call은 새로운 프로그램으로 대체됩니다현재 프로세스 공간에 프로그램을 로드하여 진입점에서 실행합니다.

so,는,fork ★★★★★★★★★★★★★★★★★」exec는 현재 프로세스의 자녀로 새로운 프로그램을 실행하기 위해 종종 순차적으로 사용됩니다.은 보통 여러분이 하려고 할 마다 이렇게 .find- 껍데기가 갈라지고, 그 다음에 아이가 장전합니다.findI/O를 사용하다

하지만 함께 사용할 필요는 없습니다. 수 있습니다.forkitself itself exec예를 들어 프로그램에 부모 코드와 자녀 코드가 모두 포함되어 있는 경우(각 구현에는 제한이 있을 수 있습니다).은, 포토와 TCP 리슨 에 대해서, 꽤 되고 있습니다(도 사용되고 fork부모가 리스닝으로 돌아가는 동안 특정 요청을 처리하기 위해 자신의 복사본을 만듭니다.

이 끝났다는 다른 도 다른 을 실행할 필요가 fork,exec 다음에 또 한 번.wait아이를 위해서.프로세스 공간에 아이를 직접 적재할 수 있습니다.

된 UNIX가 .fork카피 온 라이트은, 의 카피를 입니다.fork ,프로그램만으로 할 수 프로그램입니다.fork andexec프로세스 공간 전체를 복사할 필요가 없습니다.

경우,exec following이라고 불립니다.fork(대부분 이렇게 됩니다), 프로세스 공간에 쓰기가 발생하고 하위 프로세스에 대해 복사됩니다.

of의 가족은 .execcalls)execl,execle,execve 단, ()는exec여기서 문맥상으로는 그 중 하나를 의미합니다.

인 '나다'를 .fork/exec을 실시합니다.bash 은, 「」가 하기 됩니다.ls★★★★★★★★★★★★★★★★★★:

+--------+
| pid=7  |
| ppid=4 |
| bash   |
+--------+
    |
    | calls fork
    V
+--------+             +--------+
| pid=7  |    forks    | pid=22 |
| ppid=4 | ----------> | ppid=7 |
| bash   |             | bash   |
+--------+             +--------+
    |                      |
    | waits for pid 22     | calls exec to run ls
    |                      V
    |                  +--------+
    |                  | pid=22 |
    |                  | ppid=7 |
    |                  | ls     |
    V                  +--------+
+--------+                 |
| pid=7  |                 | exits
| ppid=4 | <---------------+
| bash   |
+--------+
    |
    | continues
    V

fork()는 현재의 프로세스를 2개의 프로세스로 분할합니다.하는 두 의 개별 . 즉, ,, 프, 프, 프, 프, 프, 프, 프, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, or, piece, piece,

 int pid = fork();

 if (pid == 0)
 {
     printf("I'm the child");
 }
 else
 {
     printf("I'm the parent, my child is %i", pid);
     // here we can kill the child, but that's not very parently of us
 }

이이 、 네음을을려려 。이제 두 개의 프로세스에서 거의 동일한 상태의 코드가 하나 실행됩니다.자프로세스를 의 모든 와 메모리를 합니다.자프로세스는 자프로세스를 작성한 프로세스의 와 메모리를 상속합니다.여기에는 이 프로세스를 작성한 지 얼마 안 된 장소부터 시작합니다.fork()츠미야은 '''입니다'''fork()리턴 코드를 사용하여 자신이 부모인지 자식인지를 알 수 있습니다.아이디

exec하기 쉬우니까 '알려주세요'라고 하면 요.exec대상 실행 파일을 사용하여 프로세스를 실행하며 동일한 코드를 실행하거나 동일한 상태를 상속하는 두 프로세스가 없습니다.@ @Steve Hawkins는 @Steve Hawkins입니다.exec에 쓸 수 요.fork현재 프로세스에서 대상 실행 파일을 실행합니다.

Marc Rochkind의 "Advanced Unix Programming"에서 나온 몇 가지 개념은 다음과 같은 다양한 역할을 이해하는 데 도움이 되었다고 생각합니다.fork()/exec() CreateProcess() 표시:

프로그램은 디스크의 일반 파일에 보관되는 명령 및 데이터의 집합입니다(1.1.2 프로그램, 프로세스 및 스레드).

.

프로그램을 실행하기 위해 커널은 먼저 프로그램이 실행되는 환경인 새로운 프로세스를 생성하도록 요구됩니다.(또한 1.1.2 프로그램, 프로세스 및 스레드부터)

.

프로세스와 프로그램의 차이를 완전히 이해하지 않고서는 execute 또는 fork system 호출을 이해할 수 없습니다.이러한 용어가 처음 사용하시는 경우, 섹션 1.1.2를 다시 확인해 보시기 바랍니다.지금 바로 진행할 준비가 되셨다면, 그 차이를 한 문장으로 요약해 드리겠습니다.프로세스는 명령, 사용자 데이터 및 시스템 데이터 세그먼트와 런타임에 획득한 다른 많은 리소스로 구성된 실행 환경이며, 프로그램은 프로세스의 명령 및 사용자 데이터 세그먼트를 초기화하는 데 사용되는 명령 및 데이터를 포함하는 파일입니다.(5.3 이후)exec

하면, 「동작」의 .fork() ★★★★★★★★★★★★★★★★★」exec()함수는 다음과 같이 요약할 수 있습니다.

  • fork()는 현재 .
  • exec()을 다른 .

(이것은 기본적으로 팍스디아블로의 훨씬 상세한 답변의 단순화된 '더미용' 버전입니다.)

포크(Fork)는 으로 구조대 있다여기에 이미지 설명 입력

int cpid = fork( );

if (cpid = = 0) 
{

  //child code

  exit(0);

}

//parent code

wait(cpid);

// end

(자 프로세스 텍스트(코드), data, stack은 호출 프로세스와 동일)자 프로세스는 if 블록에서 코드를 실행합니다.

EXEC으로 구조대동작합니다.여기에 이미지 설명 입력

int cpid = fork( );

if (cpid = = 0) 
{   
  //child code

  exec(foo);

  exit(0);    
}

//parent code

wait(cpid);

// end

(exec call unix 커널이 자 프로세스 텍스트, 데이터, 스택을 지우고 foo 프로세스 관련 텍스트/데이터로 채워진 후) 따라서 자 프로세스가 다른 코드(foo의 코드 {parent와 동일하지 않음})를 가집니다.

「 」의 주된 fork() ★★★★★★★★★★★★★★★★★」exec() '그것은'입니다.

fork()system call은 현재 실행 중인 프로그램의 클론을 만듭니다.원래 프로그램은 fork() 함수 호출 후 다음 줄의 코드로 실행을 계속합니다.또한 복제는 코드 다음 줄에서 실행을 시작합니다.http://timmurphy.org/2014/04/26/using-fork-in-cc-a-minimum-working-example/ 에서 받은 다음 코드를 보세요.

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
    printf("--beginning of program\n");
    int counter = 0;
    pid_t pid = fork();
    if (pid == 0)
    {
        // child process
        int i = 0;
        for (; i < 5; ++i)
        {
            printf("child process: counter=%d\n", ++counter);
        }
    }
    else if (pid > 0)
    {
        // parent process
        int j = 0;
        for (; j < 5; ++j)
        {
            printf("parent process: counter=%d\n", ++counter);
        }
    }
    else
    {
        // fork failed
        printf("fork() failed!\n");
        return 1;
    }
    printf("--end of program--\n");
    return 0;
}

은 0으로 변수를 '0fork()콜 후 2개의 되며 둘 다 시킵니다. 포크 콜 후 2개의 프로세스가 병렬로 실행되며 둘 다 자체 버전의 카운터를 증가시킵니다.각 프로세스는 완료까지 실행되며 종료됩니다.프로세스가 병렬로 진행되기 때문에 어느 것이 먼저 끝날지 알 수 없습니다.이 프로그램을 실행하면 다음과 같은 내용이 인쇄됩니다.단, 실행 결과에 따라 다를 수 있습니다.

--beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
child process: counter=1
parent process: counter=4
child process: counter=2
parent process: counter=5
child process: counter=3
--end of program--
child process: counter=4
child process: counter=5
--end of program--

exec()시스템 콜 패밀리는 프로세스의 현재 실행 중인 코드를 다른 코드로 대체합니다.프로세스는 PID를 유지하지만 새 프로그램이 됩니다.를 들어, 코드 '비슷하다'를 생각해 .

#include <stdio.h> 
#include <unistd.h> 
main() {
 char program[80],*args[3];
 int i; 
printf("Ready to exec()...\n"); 
strcpy(program,"date"); 
args[0]="date"; 
args[1]="-u"; 
args[2]=NULL; 
i=execvp(program,args); 
printf("i=%d ... did it work?\n",i); 
} 

에서는, 「 」를 호출합니다.execvp()해당 코드를 날짜 프로그램으로 대체하는 함수입니다.되어 있는 이 하면 "exec1.c"라는됩니다.

Ready to exec()... 
Tue Jul 15 20:17:53 UTC 2008 

프로그램은 -Ready to exec() . . " 행을 출력하고 execvp() 함수를 호출한 후 코드를 날짜 프로그램으로 바꿉니다.이 시점에서 코드가 치환되어 있기 때문에, 행 - . . wid it worked 」는 표시되지 않는 것에 주의해 주세요.대신 -date -u를 실행했을 때의 출력이 표시됩니다.

이들은 새로운 하위 프로세스를 생성하기 위해 함께 사용됩니다. " ", " " 를 호출합니다.fork현재 프로세스(자 프로세스)의 복사본을 만듭니다.ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ는,exec하위 프로세스 내에서 상위 프로세스의 복사본을 새 프로세스로 "바꾸기"하도록 호출됩니다.

프로세스는 다음과 같습니다.

child = fork();  //Fork returns a PID for the parent process, or 0 for the child, or -1 for Fail

if (child < 0) {
    std::cout << "Failed to fork GUI process...Exiting" << std::endl;
    exit (-1);
} else if (child == 0) {       // This is the Child Process
    // Call one of the "exec" functions to create the child process
    execvp (argv[0], const_cast<char**>(argv));
} else {                       // This is the Parent Process
    //Continue executing parent process
}

fork()는 현재 프로세스의 복사본을 만들고 fork() 호출 직후부터 새로운 아이로 실행합니다.fork() 뒤에 fork() 함수의 반환값을 제외하고 동일합니다(자세한 내용은 RTFM).그 후, 2개의 프로세스는 한층 더 분산해, 공유 파일 핸들을 개입시키지 않는 한, 한쪽이 다른 한쪽을 간섭할 수 없게 됩니다.

exec()은 현재의 프로세스를 새로운 프로세스로 바꿉니다.fork()와는 관계가 없습니다.단, exec()은 현재 프로세스를 대체하는 것이 아니라 다른 하위 프로세스를 실행하는 것이 바람직할 때 fork() 뒤에 따라오는 경우가 많습니다.

여기에 이미지 설명 입력fork():

실행 중인 프로세스의 복사본을 만듭니다.실행 중인 프로세스를 부모 프로세스라고 하며 새로 생성된 프로세스를 자식 프로세스라고 합니다.이 둘을 구별하는 방법은 반환된 값을 확인하는 것입니다.

  1. fork()는 부모 (pid합니다.

  2. fork()0으로 하다

exec()

프로세스 내에서 새로운 프로세스를 시작합니다.기존 프로그램을 대체하여 현재 프로세스에 새 프로그램을 로드합니다.

fork()+exec():

는, 우선 「일단」을 합니다.fork() 새로운 하고 나서, 「」를 참조해당됩니다.exec()즉, (예를 들어, 실행)

int main( void ) 
{
    int pid = fork();
    if ( pid == 0 ) 
    {
        execvp( "find", argv );
    }

    //Put the parent to sleep for 2 sec,let the child finished executing 
    wait( 2 );

    return 0;
}

하기 위한 인 예fork() ★★★★★★★★★★★★★★★★★」exec()concept는 로 사용자가 시스템에 로그인한 후 일반적으로 실행하는 명령어인터프리터 프로그램입니다셸은 명령줄의 첫 번째 단어를 명령 이름으로 해석합니다.

많은 명령에서 포크와 하위 프로세스는 명령줄의 나머지 단어를 명령어에 대한 매개 변수로 처리하는 이름과 관련된 명령을 실행합니다.

에서는 3종류의 명령어를 사용할 수 있습니다.첫째, 명령어는 소스 코드(예를 들어 C 프로그램)의 컴파일에 의해 생성된 오브젝트 코드를 포함하는 실행 파일일 수 있다.두 번째 명령어는 셸 명령줄 시퀀스를 포함하는 실행 파일일 수 있습니다.마지막으로 명령어는 (실행 파일 ex->cd,ls 등이 아닌) 내부 셸 명령어일 수 있습니다.

언급URL : https://stackoverflow.com/questions/1653340/differences-between-fork-and-exec

반응형