나는 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 () 호출 후 자식 프로세스는 어디에서 실행을 시작합니까?
새 프로세스는 fork()
호출 내에서 생성되고 부모처럼 반환되는 것으로 시작됩니다. fork()
의 반환 값 (retval
에 저장)은 다음과 같습니다.
테스트 코드가 올바르게 작동합니다. 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