fork()和exec()的区别

fork()exec()的区别

在Linux系统中,fork()exec()是两个常用的系统调用,它们都与进程有关。但是它们的用途是不同的,这里详细讲解两者的区别。

fork()

fork()的作用是创建一个新的进程,新进程是原进程的副本,这个新进程被称为子进程。子进程具有与父进程(即原进程)完全相同的代码和数据,但是其运行状态和内存空间都是独立的,即父子进程之间不共享内存空间。

下面是一个简单的示例,展示了fork()的基本使用方法:

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

int main() {
   pid_t pid;
   int x = 1;

   pid = fork();

   if (pid == 0) {
      x++;
      printf("x in child process: %d\n", x); // 子进程中的 x
   }
   else {
      x--;
      printf("x in parent process: %d\n", x); // 父进程中的 x
   }
   return 0;
}

输出如下:

x in child process: 2
x in parent process: 0

在示例中,fork()创建了一个子进程。子进程执行了x++操作,x的值变为了2,而在父进程中x--操作使得x的值变为了0。

exec()

exec()的作用是在当前进程中执行一个新的程序,取代当前进程的数据和代码。也就是说,exec()调用之后,原来进程的代码和数据都被新的程序的代码和数据所取代。

下面是一个简单的示例,展示了exec()的基本使用方法:

#include<unistd.h>

int main() {
   char *argv[2];
   argv[0] = "/bin/ls"; // 为 ls 命令的绝对路径
   argv[1] = NULL; // 参数列表必须以 NULL 结束 

   execv("/bin/ls", argv);
   return 0;
}

这个程序调用了execv()函数,用/bin/ls作为参数来执行ls命令。执行该程序,将输出当前目录下的文件列表。

区别

fork()exec()一般一起使用,而且是顺序执行。调用fork()创建子进程后,一般立即调用exec()加载新的程序运行。但fork()exec()的区别在于它们的目的和作用不同:

  • fork()的作用是创建一个新的进程,与父进程的代码和数据相同,但运行状态和内存空间互不干扰。
  • exec()的作用是在当前进程中执行新程序的代码和数据,原来的进程被新程序取代。

在"fork()"和"exec()"的典型用法中,父进程调用"fork()"创建一个子进程,然后父进程通过子进程中的"exec()"函数来加载一个新的进程映像,使子进程成为一个新进程,从而执行由父进程所指定的程序。下面给出一个例子:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

#define MAXLINE 1024

int main()
{
    char buf[MAXLINE];
    pid_t pid;
    int status;

    printf("%% "); /* print prompt (printf requires %% to print %) */
    while (fgets(buf, MAXLINE, stdin) != NULL) {
        if (buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = '\0';

        if ((pid = fork()) < 0) {
            printf("fork error");
            continue;
        } else if (pid == 0) { /* child */
            execlp(buf, buf, (char *) 0);
            printf("couldn’t execute: %s", buf);
            exit(127);
        }

        /* parent */
        if ((pid = waitpid(pid, &status, 0)) < 0)
            printf("waitpid error");
        printf("%% ");
    }
    exit(0);
}

这个程序通过fgets读入命令行输入,调用fork()创建一个新进程,子进程中调用execlp()函数合适地加载新的程序并执行,父进程则等待新建子进程结束并给出shell提示。这里 exec()是与 fork()配合使用的常用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:fork()和exec()的区别 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C语言中花式退出程序的方式总结

    下面是一个完整的“C语言中花式退出程序的方式总结”的攻略。 花式退出程序 程序退出是指程序终止运行并离开当前程序。C语言中有很多种方式能够退出程序,下面将以如下方式进行说明: Exit方法 Return方法 异常退出方法 Exit方法 通过调用函数exit()可以让程序直接退出。exit()函数的声明在 stdlib.h 头文件中。 void exit(in…

    C 2023年5月23日
    00
  • java 出现Zipexception 异常的解决办法

    当我们使用 Java 解压缩 zip 文件时,有时候会遇到 ZipException 异常,这主要是由于 zip 文件损坏或者 zip 文件格式不正确导致的。本文将会详细介绍如何解决这个问题。 解决方案 检查 zip 文件是否被损坏:如果 zip 文件损坏,那么在解压缩时就会出现异常。可以使用 WinRAR 或其他压缩软件对文件进行检查或尝试重新下载文件。如…

    C 2023年5月23日
    00
  • C语言函数多个返回值方式

    C语言函数多个返回值方式 在C语言中,函数通常只能返回一个返回值。这可能会限制一些操作的实现,特别是在需要返回多个值的情况下。然而,C语言提供了多种方式来解决这个问题。 方式一:结构体 一种实现方式是通过使用结构体返回多个值。结构体通常定义了相​​关字段,而每个字段都可以看作是一个返回值。 typedef struct { int a; char b; fl…

    C 2023年5月23日
    00
  • MySQL与PHP的基础与应用专题之数据完整性

    MySQL与PHP的基础与应用专题之数据完整性攻略 1. 数据完整性的概念 数据完整性是指数据的准确性、合法性、一致性和有效性等方面。 在数据库中,可以通过设置约束条件来保证数据的完整性,包括以下几种类型的约束: 主键约束 外键约束 唯一约束 非空约束 默认约束 检查约束 2. 主键约束 主键是唯一标识一张表中某一行数据的字段或字段组合,主键的值必须唯一且不…

    C 2023年5月23日
    00
  • C++中的对象数组详细解析

    C++中的对象数组详细解析 什么是对象数组 对象数组是指由多个相同类型的对象依次排列组成的数组。在 C++ 中,一个对象数组一旦被定义,就会在内存中分配相应的空间,同时数组名也被定义为一个指向该数组首元素的指针。 定义一个对象数组示例: class Person { public: Person(string name, int age) { this-&g…

    C 2023年5月22日
    00
  • C/C++ – 从代码到可执行程序的过程详解

    那我就详细讲解一下C/C++代码从源码到可执行程序的过程,包括编译、链接和生成可执行文件的流程。具体的攻略如下: 一、编译过程 1. 预处理器(Preprocessor) 编译指令 gcc -E main.c -o main.i 或 g++ -E main.cpp -o main.i 将源代码文件 main.c 或 main.cpp 放入预处理器,对含有 #…

    C 2023年5月23日
    00
  • visual studio 2010怎么创建c项目?

    Visual Studio 2010是一个强大的集成开发环境 (IDE),可用于创建各种类型的项目,包括C++项目。下面是创建C++项目的详细步骤: 打开Visual Studio 2010,点击“文件”菜单,选择“新建”-> “项目”。 在“新建项目”对话框中,选择“Win32控制台应用程序”模板,命名项目名称,并选择项目保存的位置。如果需要在项目中…

    C 2023年5月23日
    00
  • C语言如何读取bmp图像

    读取BMP图像是C语言开发中的一项基础任务。下面是C语言读取bmp图像的攻略: 步骤一:打开BMP文件 C语言中读取BMP图像的第一步是打开该文件。我们可以使用标准C库文件操作函数fopen()打开文件,打开模式为“二进制读取模式”(”rb”)。以下是示例代码: FILE* bmpfile = fopen("example.bmp", &…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部