C 中 fork() 和 exec() 的区别

这里我们将看到C中fork()和exec()系统调用的效果。fork用于通过复制调用进程来创建一个新进程。新进程是子进程。请参阅以下属性。

  • 子进程有自己唯一的进程 ID。

  • 子进程的父进程id与调用进程的进程id相同。

  • 子进程不继承父进程的内存锁和信号量。

在fork()返回子进程的PID。如果该值非零,那么它是父进程的 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) { //进程id为负时,报错,无法fork
      printf("can't fork, error occured\n");
         exit(EXIT_FAILURE);
   } else if (process_id == 0) { //子进程被创建
      printf("The child process is (%u)\n",getpid());
         char * argv_list[] = {"ls","-lart","/home",NULL};
      execv("ls",argv_list); // execv() 仅在发生错误时返回。
      exit(0);
   } else { //对于父进程
      printf("The parent process is (%u)\n",getppid());
      if (waitpid(process_id, &state, 0) > 0) { //等到进程改变其状态
         if (WIFEXITED(state) && !WEXITSTATUS(state))
            printf("program is executed successfully\n");
         else if (WIFEXITED(state) && WEXITSTATUS(state)) {
            if (WEXITSTATUS(state) == 127) {
               printf("Execution failed\n");
            } else
               printf("program terminated with non-zero status\n");
         } else
            printf("program didn't terminate normally\n");
      }
      else {
         printf("waitpid() function failed\n");
      }
      exit(0);
   }
   return 0;
}
输出结果
The parent process is (8627)
The child process is (8756)
program is executed successfully