Linux创建子进程执行任务

Linux 操作系统紧紧依赖进程创建来满足用户的需求。例如,只要用户输入一条命令,shell 进程就创建一个新进程,新进程运行 shell 的另一个拷贝并执行用户输入的命令。Linux 系统中通过 fork/vfork 系统调用来创建新进程。本文将介绍如何使用 fork/vfork 系统调用来创建新进程并使用 exec 族函数在新进程中执行任务。

要创建一个进程,最基本的系统调用是 fork:

调用 fork 时,系统将创建一个与当前进程相同的新进程。通常将原有的进程称为父进程,把新创建的进程称为子进程。子进程是父进程的一个拷贝,子进程获得同父进程相同的数据,但是同父进程使用不同的数据段和堆栈段。子进程从父进程继承大多数的属性,但是也修改一些属性,下表对比了父子进程间的属性差异:

下面是一个常见的演示 fork 工作原理的 demo(笔者的环境为 Ubuntu 16.04 desktop):

把上面的代码保存到文件 forkdemo.c 文件中,并执行下面的命令编译:

然后运行编译出来的 forkdemo 程序:

fork 函数的特点是 “调用一次,返回两次”:在父进程中调用一次,在父进程和子进程中各返回一次。在父进程中返回时的返回值为子进程的 PID,而在子进程中返回时的返回值为 0,并且返回后都将执行 fork 函数调用之后的语句。如果 fork 函数调用失败,则返回值为 -1。
我们细想会发现,fork 函数的返回值设计还是很高明的。在子进程中 fork 函数返回 0,那么子进程仍然可以调用 getpid 函数得到自己的 PID,也可以调用 getppid 函数得到父进程 PID。在父进程中用 getpid 函数可以得到自己的 PID,如果想得到子进程的PID,唯一的办法就是把 fork 函数的返回值记录下来。
注意:执行 forkdemo 程序时的输出是会发生变化的,可能先打印父进程的信息,也可能先打印子进程的信息。

vfork 系统调用和 fork 系统调用的功能基本相同。vfork 系统调用创建的进程共享其父进程的内存地址空间,但是并不完全复制父进程的数据段,而是和父进程共享其数据段。为了防止父进程重写子进程需要的数据,父进程会被 vfork 调用阻塞,直到子进程退出或执行一个新的程序。由于调用 vfork 函数时父进程被挂起,所以如果我们使用 vfork 函数替换 forkdemo 中的 fork 函数,那么执行程序时输出信息的顺序就不会变化了。

使用 vfork 创建的子进程一般会通过 exec 族函数执行新的程序。接下来让我们先了解下 exec 族函数。

使用 fork/vfork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往需要调用一个 exec 族函数以执行另外一个程序。当进程调用 exec 族函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的起始处开始执行。调用 exec 族函数并不创建新进程,所以调用 exec 族函数前后该进程的 PID 并不改变。

exec 族函数一共有六个:

函数名字中带字母 “l” 的表示其参数个数不确定,带字母 “v” 的表示使用字符串数组指针 argv 指向参数列表。
函数名字中含有字母 “p” 的表示可以自动在环境变量 PATH 指定的路径中搜索要执行的程序。
函数名字中含有字母 “e” 的函数比其它函数多一个参数 envp。该参数是字符串数组指针,用于指定环境变量。调用这样的函数时,可以由用户自行设定子进程的环境变量,存放在参数 envp 所指向的字符串数组中。

事实上,只有 execve 是真正的系统调用,其它五个函数最终都调用 execve。这些函数之间的关系如下图所示(此图来自互联网):

exec 族函数的特征:调用 exec 族函数会把新的程序装载到当前进程中。在调用过 exec 族函数后,进程中执行的代码就与之前完全不同了,所以 exec 函数调用之后的代码是不会被执行的。

下面让我们通过 vfork 和 execve 函数实现在子进程中执行 ls 命令:

把上面的代码保存到文件 subprocessdemo.c 文件中,并执行下面的命令编译:

然后运行编译出来的 subprocessdemo程序:

fork/vfork 函数和 exec 族函数都是 Linux 系统中非常重要的概念。本文试图通过简单的 demo 来演示这些函数的基本用法,为理解 Linux 系统中父进程与子进程的概念提供一些直观的感受。

 

参考:

原文链接:https://www.cnblogs.com/sparkdev/p/8214455.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/32952

(0)
优速盾-小U的头像优速盾-小U
上一篇 2025年10月30日 18:56
下一篇 2025年11月1日 07:08

相关推荐

  • andriodSocket编程

    -UDP协议和TCP协议 UDP协议和TCP协议是互联网使用最广的两种协议都是基于IP的协议。第一个区别是UDP协议是一个不太靠谱的协议,UDP协议把数据都打成数据包,数据包上自带…

    行业资讯 2024年10月18日
    00319
  • 如何确保网站的安全性

    大部分企业通过网站平台来进行信息发布、交流及宣传、推广企业业务,用户可以通过网站对企业进行初步的了解,并进一步获取咨询服务。企业网站不光是一个展示企业形象的平台,更是一种有效的营销…

    行业资讯 2023年1月11日
    00826
  • CloudFlare 免费CDN加速 使用方法

    前言 cloudflare 是一家国外的 cdn 加速服务商,还是很有名气的。提供免费和付费的加速和网站保护服务。百度云加速的国外节点就是和 cloudflare 合…

    2022年7月30日
    002.2K
  • 云服务器配置价格表内容

    云厂商如阿里云、腾讯云、华为云等,云服务器越来越多如何选择性能高价格便宜的云服务器?首先云服务器吧建议选择大品牌云厂商,云服务器要注意数据可靠性,大厂云服务器在安全性、可靠性方面更…

    行业资讯 2025年5月13日
    00195
  • 怎么设置腾讯云CDN缓存规则

    cdn主要功能是在不同的地点缓存内容,通过负载均衡技术,将用户的请求定向到最合适的缓存服务器上去获取内容,比如说,是北京的用户,我们让他访问北京的节点,深圳的用户,我们让他访问深圳…

    2024年10月31日
    00308
  • Vue之三与后端交互

    零:与后端交互 – ajax         这里可以看出:前端向后端成功发送了请求,后端也成功响应了,但是前端却报错了 这是因…

    行业资讯 2022年7月30日
    00908
  • jqueryJSON的解析方式

    考虑都考虑的是服务器返回的是JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明。 var data=” …

    行业资讯 2025年7月26日
    00399
  • 水墨云怎么样?

    今天看到水墨云这个云服务厂商,才开始是做 cdn 的,之后开始做 vps 业务。 我登陆官方网站,查看了它家的产品大部分是年付,且不支持退款,于是我打消了每一台服务器测试的念头,这…

    2022年7月30日
    00734
  • 三维GIS参数要求

    三维GIS可视化平台:用户可在高精度三维环境中浏览、查看、展示并分析地理数据。 支持WGS 84坐标系,CGCS2000以及CGCS2000投影坐标系,西安80以及西安80投影坐标…

    行业资讯 2025年4月20日
    00182
  • HTTP04–CDN知识

    一、cdn用途及概念 目的: CDN是内容分布网路(Content Delivery Network)的简称,目的是将网站内容发布到最接近用户的边缘,使用户就近获取内容,提高相应速…

    2022年11月16日
    00817

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml