> 백엔드 개발 > C++ > C 언어에서 fork()와 exec()의 차이점은 무엇입니까?

C 언어에서 fork()와 exec()의 차이점은 무엇입니까?

王林
풀어 주다: 2023-09-13 11:01:02
앞으로
1490명이 탐색했습니다.

C 언어에서 fork()와 exec()의 차이점은 무엇입니까?

여기서 C 언어에서 fork() 및 exec() 시스템 호출의 효과를 살펴보겠습니다. 포크는 호출 프로세스를 복사하여 새 프로세스를 만드는 데 사용됩니다. 새 프로세스는 하위 프로세스입니다. 다음 속성을 참고하시기 바랍니다.

  • 하위 프로세스에는 고유한 프로세스 ID가 있습니다.
  • 하위 프로세스의 상위 프로세스 ID는 호출 프로세스의 프로세스 ID와 동일합니다.
  • 하위 프로세스는 상위 프로세스의 메모리 잠금 및 세마포어를 상속하지 않습니다.

fork()는 하위 프로세스의 PID를 반환합니다. 값이 0이 아니면 상위 프로세스의 ID이고, 값이 0이면 하위 프로세스의 ID입니다.

exec() 시스템 호출은 현재 프로세스 이미지를 새 프로세스 이미지로 바꾸는 데 사용됩니다. 프로그램을 현재 공간에 로드하고 진입점에서 실행합니다.

따라서, fork()와 exec()의 주요 차이점은 fork()가 기본 프로세스와 동일한 프로세스의 새 복사본을 시작한다는 것입니다. exec()는 현재 프로세스 이미지를 새로운 프로세스 이미지로 대체하며, 상위 프로세스와 하위 프로세스가 동시에 실행됩니다.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main() {
   pid_t process_id;
   int return_val = 1;
   int state;
   process_id = fork();
   if (process_id == -1) { //when process id is negative, there is an error, unable to fork
      printf("can&#39;t fork, error occured</p><p>");
         exit(EXIT_FAILURE);
   } else if (process_id == 0) { //the child process is created
      printf("The child process is (%u)</p><p>",getpid());
         char * argv_list[] = {"ls","-lart","/home",NULL};
      execv("ls",argv_list); // the execv() only return if error occured.
      exit(0);
   } else { //for the parent process
      printf("The parent process is (%u)</p><p>",getppid());
      if (waitpid(process_id, &state, 0) > 0) { //wait untill the process change its state
         if (WIFEXITED(state) && !WEXITSTATUS(state))
            printf("program is executed successfully</p><p>");
         else if (WIFEXITED(state) && WEXITSTATUS(state)) {
            if (WEXITSTATUS(state) == 127) {
               printf("Execution failed</p><p>");
            } else
               printf("program terminated with non-zero status</p><p>");
         } else
            printf("program didn&#39;t terminate normally</p><p>");
      }
      else {
         printf("waitpid() function failed</p><p>");
      }
      exit(0);
   }
   return 0;
}
로그인 후 복사

출력

The parent process is (8627)
The child process is (8756)
program is executed successfully
로그인 후 복사

위 내용은 C 언어에서 fork()와 exec()의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:tutorialspoint.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿