[c] fork ()의 ​​목적은 무엇입니까?

Linux의 많은 프로그램과 매뉴얼 페이지에서 fork(). 왜 우리는 사용해야 fork()하며 그 목적은 무엇입니까?



답변

fork()Unix에서 새로운 프로세스를 만드는 방법입니다. 전화를 걸면 fork자체 주소 공간 이있는 자체 프로세스의 복사본을 만드는 것 입니다. 이를 통해 여러 작업이 마치 각자가 시스템의 전체 메모리를 가지고있는 것처럼 서로 독립적으로 실행할 수 있습니다.

다음은의 몇 가지 사용 예입니다 fork.

  1. 귀하의 사용은 fork명령 줄에서 호출하는 프로그램을 실행합니다.
  2. 아파치 와 같은 웹 서버는 fork각각 자체 주소 공간에서 요청을 처리하는 여러 서버 프로세스를 만드는 데 사용 합니다. 한 사람이 죽거나 메모리가 누수되는 경우 다른 사람은 영향을받지 않으므로 내결함성을위한 메커니즘으로 작동합니다.
  3. Google 크롬fork별도의 프로세스 내에서 각 페이지를 처리 하는 데 사용 합니다. 이렇게하면 한 페이지의 클라이언트 측 코드가 전체 브라우저를 다운시키는 것을 방지 할 수 있습니다.
  4. forkMPI를 사용하여 작성된 것과 같은 일부 병렬 프로그램에서 프로세스를 생성하는 데 사용됩니다 . 이는 자체 주소 공간이없고 프로세스 내에 존재 하는 스레드 사용과 다릅니다 .
  5. 스크립팅 언어는 fork간접적으로 자식 프로세스를 시작합니다. 예를 들어 subprocess.PopenPython에서 와 같은 명령을 사용할 때마다 fork하위 프로세스가되어 출력을 읽습니다. 이를 통해 프로그램이 함께 작동 할 수 있습니다.

fork셸에서의 일반적인 사용법은 다음과 같습니다.

int child_process_id = fork();
if (child_process_id) {
    // Fork returns a valid pid in the parent process.  Parent executes this.

    // wait for the child process to complete
    waitpid(child_process_id, ...);  // omitted extra args for brevity

    // child process finished!
} else {
    // Fork returns 0 in the child process.  Child executes this.

    // new argv array for the child process
    const char *argv[] = {"arg1", "arg2", "arg3", NULL};

    // now start executing some other program
    exec("/path/to/a/program", argv);
}

쉘은를 사용하여 자식 프로세스를 생성하고 exec완료 될 때까지 기다린 다음 자체 실행을 계속합니다. 이런 식으로 포크를 사용할 필요는 없습니다. 병렬 프로그램처럼 항상 많은 자식 프로세스를 생성 할 수 있으며 각 프로세스는 동시에 프로그램을 실행할 수 있습니다. 기본적으로 Unix 시스템에서 새 프로세스를 만들 때마다 fork(). Windows에 해당하는 경우 CreateProcess.

더 많은 예제와 더 긴 설명을 원한다면 Wikipedia 에 적절한 요약이 있습니다. 그리고 여기에 몇 가지 슬라이드는 어떻게 여기에 현대적인 운영 시스템의 프로세스, 스레드 및 동시 작동합니다.


답변

fork ()는 유닉스가 새로운 프로세스를 만드는 방법입니다. fork ()를 호출 한 시점에서 프로세스가 복제되고 두 개의 다른 프로세스가 거기에서 실행을 계속합니다. 그 중 하나 인 자식은 fork ()가 0을 반환합니다. 다른 하나는 부모 인 fork ()가 자식의 PID (프로세스 ID)를 반환하도록합니다.

예를 들어 셸에 다음을 입력하면 셸 프로그램은 fork ()를 호출 한 다음 자식에서 전달한 명령 (이 경우 telnetd)을 실행하고 부모는 프롬프트를 다시 표시합니다. 백그라운드 프로세스의 PID를 나타내는 메시지로.

$ telnetd &

새 프로세스를 만드는 이유는 운영 체제가 동시에 많은 작업을 수행 할 수있는 방법입니다. 이것이 바로 프로그램을 실행할 수있는 이유입니다. 프로그램이 실행되는 동안 다른 창으로 전환하여 다른 작업을 수행 할 수 있습니다.


답변

fork ()는 자식 프로세스를 만드는 데 사용됩니다. fork () 함수가 호출되면 새 프로세스가 생성되고 fork () 함수 호출은 자식과 부모에 대해 다른 값을 반환합니다.

반환 값이 0이면 자신이 자식 프로세스임을 알고 있고 반환 값이 숫자 (하위 프로세스 ID)이면 부모임을 알 수 있습니다. (음수이면 포크가 실패하고 자식 프로세스가 생성되지 않은 것입니다)

http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html


답변

fork ()는 기본적으로이 함수를 호출하는 프로세스에 대한 자식 프로세스를 만드는 데 사용됩니다. fork ()를 호출 할 때마다 자식 ID에 대해 0을 반환합니다.

pid=fork()
if pid==0
//this is the child process
else if pid!=0
//this is the parent process

이를 통해 부모와 자식에 대해 서로 다른 작업을 제공하고 멀티 스레딩 기능을 사용할 수 있습니다.


답변

fork ()는 부모와 동일한 새 자식 프로세스를 만듭니다. 따라서 코드에서 실행하는 모든 것은 두 프로세스 모두에서 실행됩니다. 예를 들어 서버가 있고 여러 요청을 처리하려는 경우 매우 유용합니다.


답변

응용 프로그램을 작성하는 경우 일상적인 프로그래밍에서 포크를 사용할 필요가 없습니다.

프로그램이 어떤 작업을 수행하기 위해 다른 프로그램을 시작하도록하려는 경우에도 C 및 perl의 “system”과 같이 배후에서 포크를 사용하는 다른 간단한 인터페이스가 있습니다.

예를 들어 응용 프로그램에서 bc와 같은 다른 프로그램을 실행하여 계산을 수행하도록하려면 ‘system’을 사용하여 실행할 수 있습니다. 시스템은 새로운 프로세스를 생성하기 위해 ‘포크’를 수행 한 다음 해당 프로세스를 bc로 전환하기 위해 ‘exec’를 수행합니다. BC가 완료되면 시스템이 프로그램에 제어권을 반환합니다.

다른 프로그램을 비동기 적으로 실행할 수도 있지만 그 방법을 기억할 수 없습니다.

서버, 셸, 바이러스 또는 운영 체제를 작성하는 경우 포크를 사용하고 싶을 가능성이 높습니다.


답변

Fork는 새로운 프로세스를 만듭니다. 포크가 없으면 init 만 실행할 수있는 유닉스 시스템을 갖게됩니다.