프로세스 생성 및 종료

지금까지 우리는 프로그램을 실행할 때마다 프로세스가 생성되고 실행 완료 후 종료된다는 것을 알고 있습니다. 프로그램 내에서 프로세스를 만들어야하고 다른 작업을 예약하고 싶을 수 있습니다. 이것이 달성 될 수 있습니까? 예, 분명히 프로세스 생성을 통해. 물론 작업이 완료되면 자동으로 종료되거나 필요에 따라 종료 할 수 있습니다.

프로세스 생성은 fork() system call. 새로 생성 된 프로세스를 자식 프로세스라고하며이를 시작한 프로세스 (또는 실행이 시작된 프로세스)를 부모 프로세스라고합니다. fork () 시스템 호출 후, 이제 부모 프로세스와 자식 프로세스의 두 가지 프로세스가 있습니다. 그들을 차별화하는 방법? 매우 간단합니다. 반환 값을 통해서입니다.

자식 프로세스를 만든 후 fork () 시스템 호출 세부 정보를 살펴 보겠습니다.

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

자식 프로세스를 만듭니다. 이 호출 후에는 두 개의 프로세스가 있습니다. 기존 프로세스를 상위 프로세스라고하고 새로 생성 된 프로세스를 하위 프로세스라고합니다.

fork () 시스템 호출은 세 값 중 하나를 반환합니다.

  • 오류, 즉 자식 프로세스 생성에 실패했음을 나타내는 음수 값입니다.

  • 자식 프로세스에 대해 0을 반환합니다.

  • 상위 프로세스에 대해 양수 값을 반환합니다. 이 값은 새로 생성 된 자식 프로세스의 프로세스 ID입니다.

간단한 프로그램을 고려해 보겠습니다.

File name: basicfork.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   fork();
   printf("Called fork() system call\n");
   return 0;
}

실행 단계

편집

gcc basicfork.c -o basicfork

실행 / 출력

Called fork() system call
Called fork() system call

Note− 일반적으로 fork () 호출 후 자식 프로세스와 부모 프로세스는 다른 작업을 수행합니다. 동일한 작업을 실행해야하는 경우 각 fork () 호출에 대해 2 번 전원 n 번 실행됩니다.n fork ()가 호출 된 횟수입니다.

위의 경우 fork ()가 한 번 호출되므로 출력이 두 번 인쇄됩니다 (2 거듭 제곱 1). fork ()가 3 번 호출되면 출력은 8 번 인쇄됩니다 (2 거듭 제곱 3). 5 번 호출하면 32 번 인쇄하는 식입니다.

fork ()가 자식 프로세스를 생성하는 것을 보았으므로 부모 및 자식 프로세스의 세부 사항을 볼 차례입니다.

파일 이름 : pids_after_fork.c

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   pid_t pid, mypid, myppid;
   pid = getpid();
   printf("Before fork: Process id is %d\n", pid);
   pid = fork();

   if (pid < 0) {
      perror("fork() failure\n");
      return 1;
   }

   // Child process
   if (pid == 0) {
      printf("This is child process\n");
      mypid = getpid();
      myppid = getppid();
      printf("Process id is %d and PPID is %d\n", mypid, myppid);
   } else { // Parent process 
      sleep(2);
      printf("This is parent process\n");
      mypid = getpid();
      myppid = getppid();
      printf("Process id is %d and PPID is %d\n", mypid, myppid);
      printf("Newly created process id or child pid is %d\n", pid);
   }
   return 0;
}

컴파일 및 실행 단계

Before fork: Process id is 166629
This is child process
Process id is 166630 and PPID is 166629
Before fork: Process id is 166629
This is parent process
Process id is 166629 and PPID is 166628
Newly created process id or child pid is 166630

프로세스는 두 가지 방법 중 하나로 종료 할 수 있습니다.

  • 비정상적으로 특정 신호 (예 : 종료 신호)를 전달할 때 발생합니다.

  • 일반적으로 _exit () 시스템 호출 (또는 _Exit () 시스템 호출) 또는 exit () 라이브러리 함수를 사용합니다.

_exit ()와 exit ()의 차이점은 주로 정리 활동입니다. 그만큼exit() 컨트롤을 커널로 되돌리기 전에 정리를 수행하는 반면 _exit() (또는 _Exit ())는 컨트롤을 커널로 즉시 반환합니다.

exit ()가있는 다음 예제 프로그램을 고려하십시오.

파일 이름 : atexit_sample.c

#include <stdio.h>
#include <stdlib.h>

void exitfunc() {
   printf("Called cleanup function - exitfunc()\n");
   return;
}

int main() {
   atexit(exitfunc);
   printf("Hello, World!\n");
   exit (0);
}

컴파일 및 실행 단계

Hello, World!
Called cleanup function - exitfunc()

_exit ()를 사용하는 다음 예제 프로그램을 고려하십시오.

파일 이름 : at_exit_sample.c

#include <stdio.h>
#include <unistd.h>

void exitfunc() {
   printf("Called cleanup function - exitfunc()\n");
   return;
}

int main() {
   atexit(exitfunc);
   printf("Hello, World!\n");
   _exit (0);
}

컴파일 및 실행 단계

Hello, World!