유닉스 프로그래밍을 배우려고하는데 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()
가 하위 프로세스에 복사되고 상위 프로세스와 하위 프로세스를 혼합하지 않고 동일한 (중복, 공유되지 않은) 환경을 가진 두 개의 다른 엔티티입니다.
이제 출력을 참조하십시오 …