programing

포크는 정확히 무엇을 돌려 줍니까?

sourcejob 2023. 10. 16. 21:49
반응형

포크는 정확히 무엇을 돌려 줍니까?

성공하면 자식 프로세스의 PID가 부모 실행 스레드에 반환되고 자식 실행 스레드에 0이 반환됩니다.

p = fork();

매뉴얼 페이지가 헷갈리던데요?p와 대등한0아니면PID?

설명서가 어떻게 더 명확해질 수 있는지 모르겠어요!fork()새 프로세스를 생성하므로 두 개의 동일한 프로세스가 생성됩니다.이들을 구별하기 위해, 반환 값은fork()다르다.원래 프로세스에서는 자식 프로세스의 PID를 얻습니다.자식 프로세스에서는 0을 얻습니다.

따라서 표준적인 용도는 다음과 같습니다.

p = fork();
if (0 == p)
{
    // We're the child process
}
else if (p > 0)
{
    // We're the parent process
}
else
{
    // We're the parent process, but child couldn't be created
}
p = 포크 ();/* 오류를 범하지 않음 *//* 당신은 이제 두개의 *//* 실행 중인 프로그램 */--------------------if (p > 0) { | if (p == 0) {printf ("parent\n"; | printf ("child\n")...                       |              ...

프로세스는 한 부모만 아는 지시 트리에서 구조화됩니다(getppid()). 한마디로.fork()돌아온다-1다른 많은 시스템 함수와 같이 오류가 발생하면 0이 아닌 값은 포크 호출의 시작자(부모)가 새 자식 pid를 아는 데 유용합니다.

예만큼 좋은 것은 없습니다.

/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h>     /* fork(), getpid() */
#include <stdio.h>

int main(int argc, char* argv[])
{
    int pid;

    printf("Entry point: my pid is %d, parent pid is %d\n",
           getpid(), getppid());

    pid = fork();
    if (pid == 0) {
        printf("Child: my pid is %d, parent pid is %d\n",
               getpid(), getppid());
    }
    else if (pid > 0) {
        printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
               getpid(), getppid(), pid);
    }
    else {
        printf("Parent: oops! can not create a child (my pid is %d)\n",
               getpid());
    }

    return 0;
}

그 결과(이 경우 배스는 pid 2249입니다):

Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051

일부 리소스(파일, 부모 pid 등)를 부모와 자식 간에 공유해야 하는 경우clone()(GNUC 라이브러리 및 기타의 경우)

한번만fork실행되면 두 가지 프로세스가 있습니다.호출은 각 프로세스에 다른 값을 반환합니다.

이렇게 하면.

int f;
f = fork();
if (f == 0) {
  printf("I am the child\n");
} else {
  printf("I am the parent and the childs pid is %d\n",f);

}

두 개의 메시지가 모두 인쇄됩니다.그것들은 두 개의 별개의 공정으로 인쇄되고 있습니다.이렇게 하면 생성된 두 프로세스를 구별할 수 있습니다.

여기가 시원한 부분입니다.둘 다 같아요.

글쎄, 그렇지 않습니다.근데 한 번은fork반환합니다. 이제 프로그램의 복사본개가 실행되고 있습니다!두 가지 과정.당신은 그들을 대체 우주로 생각할 수 있습니다.하나에서, 반환 값은0. 또 다른 것은, 그것은.ID새로운 공정의!

일반적으로 다음과 같은 것이 있습니다.

p = fork();
if (p == 0){
    printf("I am a child process!\n");
    //Do child things
}
else {
    printf("I am the parent process! Child is number %d\n", p);
    //Do parenty things
}

이 경우, 두 줄 모두 인쇄되지만, 다른 공정으로 인쇄됩니다!

fork()가 부모 프로세스에서 호출됩니다.그런 다음 자식 프로세스가 생성됩니다.fork()실행을 마쳤습니다.

되면 .fork()를 반환할 준비가 되었지만 상위 또는 하위 중 어느 것에 있는지에 따라 다른 값을 반환합니다.자식 프로세스에서는 0을 반환하고 부모 프로세스/스레드에서는 자식 프로세스 ID를 반환합니다.

포크는 중복 프로세스와 새로운 프로세스 컨텍스트를 만듭니다.0 값을 반환하면 자식 프로세스가 실행 중임을 의미하지만 부모 프로세스가 실행 중임을 의미하는 다른 값을 반환하면 부모 프로세스가 실행 중임을 의미합니다.우리는 일반적으로 자식 프로세스가 완료되고 부모 프로세스가 실행되기 시작하도록 wait문을 사용합니다.

나는 이것이 이렇게 작동한다고 생각합니다: pid = fork (), 코드가 두 번 실행되어야 합니다. 하나는 현재 프로세스 중이고, 하나는 하위 프로세스 중입니다.따라서 둘 다 실행할 경우의 이유를 설명합니다.그리고 순서는 현재의 과정을 먼저 한 후에 아이를 실행하는 것입니다.

언급URL : https://stackoverflow.com/questions/5577564/what-exactly-does-fork-return

반응형