태그 보관물: api

api

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

유닉스 프로그래밍을 배우려고하는데 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 () 호출 후 자식 프로세스는 어디에서 실행을 시작합니까?



답변

새로운 프로세스는 fork()호출 내에서 생성 되며 부모와 마찬가지로 프로세스 에서 반환됩니다. (당신이에 저장된 반환 값 retval에서)이 fork()될 것입니다 :

  • 자식 프로세스에서 0
  • 부모 프로세스에서 자식의 PID
  • 장애가 발생한 경우 상위 -1

테스트 코드가 올바르게 작동합니다. 그 반환 값을 저장 fork()에서 child_pid와 용도 if(이것은 에러를 확인하지 않더라도)는 ‘0’인지 아닌지 확인할


답변

나는 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의 답변을 참조하십시오 .


답변

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

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

답변

의 바로 뒤에있는 코드 fork()가 하위 프로세스에 복사되고 상위 프로세스와 하위 프로세스를 혼합하지 않고 동일한 (중복, 공유되지 않은) 환경을 가진 두 개의 다른 엔티티입니다.

이제 출력을 참조하십시오 …


답변