it-swarm-ko.com

fork () 후에 자식은 어디에서 실행을 시작합니까?

나는 UNIX 프로그래밍을 배우려고 노력 중이며 fork ()에 관한 질문을 발견했습니다. fork ()가 현재 실행중인 프로세스와 동일한 프로세스를 생성한다는 것을 이해하지만 어디서 시작합니까? 예를 들어, 코드가있는 경우

int main (int argc, char **argv)
{
    int retval;
    printf ("This is most definitely the parent process\n");
    fflush (stdout);
    retval = fork ();
    printf ("Which process printed this?\n");

    return (EXIT_SUCCESS);
}

출력은 다음과 같습니다.

이것은 확실히 상위 프로세스입니다.
어떤 프로세스가 이것을 인쇄 했습니까?
어떤 프로세스가 이것을 인쇄 했습니까?

나는 fork()이 동일한 프로세스를 생성한다고 생각했기 때문에 처음에는 그 프로그램에서 fork() 호출이 영원히 재귀 적으로 호출 될 것이라고 생각했습니다. fork()에서 만든 새 프로세스가 fork() 호출 후에 시작되는 것 같아요?

다음 코드를 추가하면 부모 프로세스와 자식 프로세스를 구분하기 위해

if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());

fork () 호출 후 자식 프로세스는 어디에서 실행을 시작합니까?

22
thomas1234

새 프로세스는 fork() 호출 내에서 생성되고 부모처럼 반환되는 것으로 시작됩니다. fork()의 반환 값 (retval에 저장)은 다음과 같습니다.

  • 0 자식 프로세스
  • 부모 프로세스에있는 자식의 PID
  • -1 실패가 있었다면 부모에서 (당연히 자식이 없음)

테스트 코드가 올바르게 작동합니다. fork()의 반환 값을 child_pid에 저장하고 if을 사용하여 0인지 여부를 확인합니다 (오류를 확인하지는 않지만).

23
Michael Mrozek

Fork ()가 동일한 프로세스를 생성한다고 생각했기 때문에 처음에는 해당 프로그램에서 fork () 호출이 영원히 재귀 적으로 호출 될 것이라고 생각했습니다. fork ()에서 만든 새 프로세스가 fork () 호출 후에 시작되는 것 같습니다.

예. 줄에 번호를 매기겠습니다.

int main (int argc, char **argv)
{
    int retval;                                               /* 1 */
    printf ("This is most definitely the parent process\n");  /* 2 */
    fflush (stdout);                                          /* 3 */
    retval = fork ();                                         /* 4 */
    printf ("Which process printed this?\n");                 /* 5 */
    return (EXIT_SUCCESS);                                    /* 6 */
}

실행 흐름은 다음과 같습니다.

caller process     fork() → ...
                          ↘
original program            exec() → 2 → 3 → 4 → 5 → 6
                                               ↘
forked program                                   5 → 6

... 당신이받은 출력을 정확히 설명합니다.

원래 프로그램과 분기 된 프로그램이 동일한 코드를 공유하기 때문에 어떻게 다르게 작동 할 수 있는지 알고 싶다면 Michael Mrozek의 답변 을 참조하십시오.

13
badp

이것에 대한 진정한 해결책은

switch (fork()) {
    case -1 :
        fprintf (stderr, "fork failed (%s)\n", strerror(errno));
        break;
    case 0 :  // child process comes here
        break;
    default : // parent process
        break;
}

// all continue here
0
ott--