저는 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);
}
출력은 다음과 같습니다
This is most definitely the parent process
Which process printed this?
Which process printed this?
나는 이것이 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()가 호출된 후 하위 프로세스는 어디에서 실행을 시작합니까?
답변1
새 프로세스는 호출 시 생성되며 fork()
상위 프로세스처럼 반환되는 위치에서 시작됩니다. (에 저장한 retval
) 반환 값은 fork()
다음과 같습니다.
- 하위 프로세스에서 0
- 상위 프로세스에 있는 하위 프로세스의 PID
- 실패하면 부모는 -1입니다(당연히 자식은 없습니다).
fork()
테스트 코드는 잘 작동합니다. in의 반환 값을 저장 child_pid
하고 이를 사용하여 if
0인지 확인합니다(오류는 확인하지 않음).
답변2
나는 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 Morozek의 답변.
답변3
진짜 해결책은
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
답변4
그럼에도 불구하고 그 이후의 코드는 fork()
하위 프로세스에 복사되며 상위 프로세스와 하위 프로세스를 혼동하지 마십시오. 두 프로세스는 동일한(공유되지 않은 중복) 환경을 가진 두 개의 다른 엔터티입니다.
이제 출력을 살펴보세요...