UNIX에서 프로세스는 언제 종료됩니까?

UNIX에서 프로세스는 언제 종료됩니까?

Unix의 프로세스는 어느 시점에서 종료됩니까? 프로세스를 종료하려면 프로그램에 exit(0)또는 같은 명령을 작성해야 합니까? return 0내 문제는 다음 코드로 인해 발생합니다.

pid_t pid=fork();
if(pid < 0)
{
         perror("Fork error\n");
         return 1;  
}
else if (pid==0) /* child */
{
        printf("CHILD My pid is:%d\n",getpid());
}
else /* parrent */
{
         wait(NULL);
         exit(0);
}

이 예에서 우리는 하위 프로세스에서 호출하지 않고 exit(0)(따라서 프로세스를 종료하지 않을 것이라고 생각합니다), 상위 프로세스에서 호출합니다 wait(NULL)(따라서 프로세스가 끝날 때까지 기다려야 합니다). 프로그램이 종료되므로 논리적으로 하위 프로세스는 어느 시점에서 종료됩니다. 하위 프로세스가 언제 종료되는지 설명할 수 있나요? 자녀가 이후에 종료되는 경우

else if (pid==0) /* child */
    {
            printf("CHILD My pid is:%d\n",getpid());
    }/* Probably the child process terminates here but then what is the point of using exit(0) */

, 그래서 그것을 사용하는 요점은 무엇입니까 exit(0)?

답변1

AC 프로그램은 다음 세 가지 상황 중 하나로 종료됩니다.

  1. 프로그램이 main함수에서 반환됩니다. 반환 값이 0이면 성공을 나타내고, 그렇지 않으면 반환 값은 종료 상태입니다. C99는 또한 반환 유형이 main있는 함수를 허용하지만 권장하지 않습니다. 여기서 from을 반환하는 것은 반환 유형을 사용하여 main에서 0을 반환하는 것과 동일한 의미를 갖습니다 .voidmainint
  2. 프로그램은 exit다음 함수 중 하나를 반환하거나 exitC11의 _exit새 함수를 반환합니다. quick_exit이들 함수 중 어느 것도 반환되지 않으며 둘 다 프로그램을 종료하는 효과가 있지만 실제로 수행하는 작업은 다릅니다(예를 들어, Quick_exit는 버퍼를 플러시하지만 Honors atexit호출을 실행하지 않습니다).
  3. 예를 들어, 프로그램이 허용되지 않는 작업을 수행했기 때문에 운영 체제는 어떤 방식으로든 프로그램을 종료합니다.

답변2

exit(0)(또는 아마도 더 이상적으로는 exit(EXIT_SUCCESS)) 모든 것이 잘 되었음을 분명히 하기 위해 사용될 수 있습니다. 즉, 코드를 읽는 사람에게 예상되는 내용에 대한 힌트를 제공하고 후속 코드에 도달하는 것을 방지합니다(도달되지 않은 코드에 대해 컴파일러 경고를 활성화할 수 있음). 자식은 _exit완료되었음을 나타내는 호출도 있어야 합니다. 그렇지 않으면 코드는 오류/자식/부모 조건 블록 뒤에 있는 모든 항목에 속하게 됩니다.

그렇지 않으면 프로세스가 정상적으로 종료되거나( exit, returnin main또는 를 통해) 호출 되거나 프로그램을 종료시키는 신호(또는 다른 곳을 통해)를 _exit먹음으로써 비정상적으로 종료 될 수 있습니다.abortraise

관련 정보