linux/UNIX中如何使用fork函数调用exec函数族,实现子进程做特定操作

2023-05-16

前言

在 Unix/Linux 操作系统中,进程是一种非常重要的概念。进程是程序执行的实例,操作系统会为每个进程分配资源,进程之间相互独立,可以进行通信。在 Unix/Linux 中,我们可以使用 fork 和 exec 函数族来创建子进程并执行新的程序。本篇博客将深入浅出地介绍 fork 函数和 exec 函数族,包括它们的基本用法、相关概念、流程图以及代码示例。

先介绍如何在子进程中使用exec函数族,想要了解fork创建子进程和exec函数族的,可以先看下面

在使用 exec 函数族之前,我们需要先使用 fork 函数创建一个新的子进程。然后,在子进程中,我们可以使用 exec 函数族来执行新的程序。exec 函数族会将当前进程的地址空间替换为新程序的地址空间,并执行新程序。新程序将从 main 函数开始执行,因此我们需要在新程序中定义 main 函数。

下面是一个示例,演示了如何在子进程中使用 exec 函数族来执行新的程序:

include <stdio.h>

include <stdlib.h>

include <unistd.h>

int main()

{

    pid_t pid;

pid = fork(); // 创建子进程

if (pid == -1) // 创建失败
{
    printf("Fork error\n");
    exit(1);
}
else if (pid == 0) // 在子进程中
{
    printf("I am child process. My pid is %d.\n", getpid());
    execl("/bin/ls", "ls", "-l", NULL); // 执行 ls -l 命令
    exit(0);
}
else // 在父进程中
{
    printf("I am parent process. My pid is %d. My child pid is %d.\n", getpid(), pid);
}

return 0;

}
在上面的示例中,我们使用 fork 函数创建了一个子进程。在子进程中,我们输出了子进程的 ID,然后使用 execl 函数来执行 ls -l 命令。在 execl 函数中,第一个参数是要执行的程序的路径,第二个参数是要传递给新程序的参数列表。我们将 ls -l 命令的路径传递给 execl 函数的第一个参数,将 ls 和 -l 两个参数传递给第二个参数,最后使用 NULL 表示参数列表的结尾。

在父进程中,我们输出了父进程和子进程的 ID,然后等待子进程结束。

fork 函数

fork函数详解链接:
fork 函数是 Unix/Linux 中非常重要的函数之一。它用于创建一个新的进程,该进程称为子进程。子进程与父进程共享大部分资源,包括代码段、数据段、堆、栈、文件描述符等。但是,子进程拥有自己的独立的进程 ID,并且具有自己的用户 ID 和组 ID。

fork 函数的原型如下:

#include <unistd.h>

pid_t fork(void);
fork 函数的返回值有以下三种情况:

在父进程中,fork 函数返回新创建子进程的进程 ID;
在子进程中,fork 函数返回 0;
如果 fork 函数返回值为负数,则表示出现错误。
下面是一个简单的示例,演示了 fork 函数的基本用法:

#include <stdio.h>
#include <unistd.h>
int main()
{
    pid_t pid;

    pid = fork(); // 创建子进程
    
    if (pid == -1) // 创建失败
    {
        printf("Fork error\n");
    }
    else if (pid == 0) // 在子进程中
    {
        printf("I am child process. My pid is %d.\n", getpid());
    }
    else // 在父进程中
    {
        printf("I am parent process. My pid is %d. My child pid is %d.\n", getpid(), pid);
    }
    
    return 0;
}

在上面的示例中,我们使用 fork 函数创建了一个子进程。在父进程中,fork 函数返回子进程的进程 ID,我们通过判断 fork 函数的返回值是否为 0 来确定当前进程是父进程还是子进程。在子进程中,我们输出了当前进程的 ID,而在父进程中,我们输出了父进程和子进程的 ID。

exec 函数族

exec 函数族详解链接:
exec 函数族用于执行新的程序。在 Unix/Linux 中,我们可以使用 exec 函数族来替换当前进程的代码段、数据段、堆和栈等信息,然后执行新的程序。exec 函数族一共有 6 个函数,包括:

int execl(const char *path, const char *arg, …);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg, …, char *const envp[]);
int execve(const char *path, charconst argv[], char *const envp[]);
int execlp(const char *file, const char *arg, …);
int execvp(const char *file, char *const argv[]);
这些函数的区别在于它们接受的参数不同,但是它们的功能都是一样的,都可以用来执行新的程序。

总结
本篇博客介绍了 fork 函数和 exec 函数族的基本用法、相关概念、流程图以及代码示例。fork 函数用于创建一个新的进程,exec 函数族用于执行新的程序。在使用 exec 函数族之前,我们需要先使用 fork 函数创建一个新的子进程。然后,在子进程中,我们可以使用 exec 函数族来执行新的程序。

希望这篇博客能够帮助你理解 fork 函数和 exec 函数族的用法。如果你还有任何问题或疑问,请随时在评论区留言,我会尽快回复

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux/UNIX中如何使用fork函数调用exec函数族,实现子进程做特定操作 的相关文章

  • 【计算机操作系统】(三)系统调用

    一 系统调用 用户接口分为命令接口 xff08 允许用户直接使用 xff09 和程序接口 xff08 允许用户通过程序间接使用 xff09 程序接口由一种系统调用组成 系统调用 是操作系统提供给应用程序 xff08 程序员 xff09 使用
  • ORA-28000错误的原因及解决办法

    当用Oracle数据库的时候 xff0c Oracle数据库时提示 ORA 28000 xff1a 帐号被锁定 导致出现改错误的原因是 xff1a 在oracle database 11g中 xff0c 默认在default概要文件中设置了
  • 常见的通信协议

    1 iic协议 物理层 特点 xff1a 1 支持多设备连接 xff0c 支持多通讯主机和从机 2 scl时钟线 sda数据线 所以是同步通信 3 通过地址访问不同设备 4 多主机使用时 xff0c 会使用仲裁方式选哪个设备 5 总线上使用
  • 计算机操作系统知识点总结(2.1.2)——进程的状态与转换

    进程的三种基本状态 xff1a xff08 1 xff09 运行态 xff1a 占有CPU xff0c 并在CPU上运行 xff08 单核处理机每一时刻最多只能有一个进程处于运行态 xff0c 双核环境下可以同时有两个进程处于运行态 xff
  • Daily practice——2021/1/31

    1 函数若无返回值 则它一定无形参 请问这个说法是正确的吗 xff1f 答 xff1a 这个说法不正确 一个函数可以有参数 xff0c 没有返回值 xff1b 可以没有参数 xff0c 有返回值 xff1b 可以没参数 xff0c 没返回值
  • 6.RTT-UART-串口接收不定长数据

    本期来分析一下串口接受不定长度数据的源码 xff0c 这个demo也在手册里面 xff0c 可以去手册上结合着API说明观看 先把代码粘出来 xff0c 后面对重点代码进行分析 程序清单 xff1a 这是一个串口设备接收不定长数据的示例代码
  • learn-AJAX(第一天)

    AJAX的简介 一 简介及其简单使用 1 概述 web程序最初的目的就是将信息放到公共的服务器上 xff0c 让所有的网络用户都可以通过浏览器进行访问 在此之前 xff0c 通过以下的方式可以使浏览器对服务器发送请求 xff08 无法通过编
  • 纯C++实现的HTTP请求(POST/GET)

    原文地址 xff1a http www cnblogs com lidabo p 6404533 html 纯C 43 43 实现的HTTP请求 xff08 POST GET xff09 xff0c 支持windows和linux xff0
  • 3--STM32多功能小车(6)--硬件电路连接

    1 电源及接线 xff1b 对于stm32和所用到的外设来说 xff0c 基本都要用5V作为输入电压 xff0c 但是市面上的电池基本没有是5V输出的 xff0c 但是却有12V的 xff0c 因此我们就需要采用12V转5V xff08 一
  • Unable to fit model using “lrm.fit”R语言使用logistic回归时

    当初笔者遇到这个错误时上网搜了常见办法 就是在lrm后面加参数 tol span class token operator 61 span span class token number 1e 9 span 或者加 maxit span c
  • 激光雷达RPLIDAR A1使用教程

    激光雷达RPLIDAR A1使用教程 一 雷达硬件连接 1 A1雷达包含组件 RPLIDAR A1开发套装包含了如下组件 xff1a o RPLIDAR A1模组 xff08 内置 PWM电机驱动器 xff09 o USB适配器 o RPL
  • 4G远程小车1-树莓派读取WTGPS+BD模块

    树莓派python读取WTGPS 43 BD模块 WTGPS 43 BD模块 模块可以通过type C线连接 xff08 自带ch430芯片 xff09 USB口 xff1b 也可以通过串口与硬件串口号相连接 IPX天线接头为IPX1代 连
  • 3.ROS&PX4--PX4环境部署

    部署PX4 amp ROS开发环境 1 安装mavros Noetic版本 span class token function sudo span span class token function apt get span span cl
  • 4.ROS&PX4--运行官方offboard起飞程序

    1 创建空间 span class token function mkdir span catkin ws span class token builtin class name cd span catkin ws span class t
  • 5.ROS&PX4--offboard模式多航点代码编写

    4 ROS amp PX4 offboard模式多航点代码编写 offboard模式多航点代码编写等待更新 offboard模式多航点代码编写 等待更新 span class token comment 64 file offb node
  • Canal安装和配置,实现监听binlog日志

    1 下载canal Release v1 1 5 alibaba canal GitHub 2 直接解压 windows和linux下都是一样 3 conf example目录下 xff0c 编辑instance propertities
  • 看论文需要用到的一些专业词汇【SOTA,Benchmark,Baseline】

    看论文需要用到的一些专业词汇 SOTA Benchmark Baseline 1 SOTA2 Benchmark xff08 基准 xff09 Baseline 基线 1 SOTA SOTA实际上就是State of the arts 的缩
  • STM32中断-外部中断

    STM32中断 外部中断配置 外部中断配置 1 配置向量中断控制器NVIC xff0c 设置中断优先级 a 配置优先级组别 b 配置相关结构体参数 中断源 抢占优先级 子优先级 c 使用函数写入参数 代码参考如下 span class to
  • Ubuntu20 网络助手无法运行

    最近开始正式啃python高级教程 xff0c 遇到第一个问题 xff0c Ubuntu20版本下 xff0c 网络助手安装后 xff0c 点击开启无反应 经过好几天晚上的折腾 xff0c 终于搞定 xff0c 贴下解决过程 Step1 终
  • 通过服务器搭建一个短视频系统(含推荐算法)

    一 前端开发 前端使用的是uni app框架 xff0c 用到的开发软件是HBuiderx xff0c 前端界面如下所示 xff1a 主要包括五大功能 xff0c 一是热门视频展示 xff08 用到了热门视频推荐算法 xff09 个人推荐视

随机推荐

  • 【已解决】error: ‘CV_GRAY2BGR’ was not declared in this scope

    这是运行高翔 slambook2 代码出现的问题 xff0c 有两种方法解决 error CV GRAY2BGR was not declared in this scope home diyu slambook2 ch8 optical
  • 镜像备份工具rsync

    文章目录 1 概述2 rsync的认证协议3 rsync命令详解4 rsync 43 inotify 1 概述 什么是rsync xff1f rsync 即 Remote Sync 是linux系统下的数据镜像备份工具 使用rsync可以远
  • 系统调用的理解

    文章目录 系统调用什么是系统调用系统调用的分类系统调用与库函数的区别 系统调用 什么是系统调用 什么是系统调用 xff1f 答 操作系统的接口函数是连接应用软件与操作系统的中间桥梁 xff0c 系统调用其实就是操作系统提供给应用程序的接口函
  • ROS与C++入门教程(记录步骤)(一)

    ROS与C 43 43 入门教程 xff08 记录步骤 xff09 0 记录学习生活1 构建工作空间1 1 建立工作空间1 2 设置成自动加载环境 2 构建Catkin包2 1 构建2 2 查看程序包依赖关系2 3 解读package xm
  • C语言:全局变量在多个c文件中公用的方法

    用C语言编写程序的时候 xff0c 我们经常会遇到这样一种情况 xff1a 希望在头文件中定义一个全局变量 xff0c 然后包含到两个不同的c文件中 xff0c 希望这个全局变量能在两个文件中共用 举例说明 xff1a 项目文件夹proje
  • 迭代器(iterator)看这篇就够了

    文章目录 前言一 迭代器是什么二 迭代器如何使用2 1 迭代器正常遍历集合2 2 完全版迭代器可以一边遍历一边删除元素2 3 简易版迭代器 总结 前言 迭代器很重要 xff0c 是遍历线性数据结构 xff08 链表 xff09 的重要方法之
  • Jquery 获取元素属性值

    获取属性 获取内置属性获取自定义属性prop value name value attr value name value jquery中内置属性只能用来获取内置 自定义只能用来获取内置 内置属性 span class token func
  • 使用evo测评工具测评性能

    防止健忘 参考EVO工具github链接 xff1a link1 开源室内激光场景数据 xff1a link2 总体来说 xff0c evo是用于处理 评估和比较里程计和SLAM算法的轨迹输出 支持的轨迹文件格式 xff1a Tum文件Ki
  • DNS内网欺骗(仅供参考)

    DNS内网欺骗 仅供参考 下面展示一些 内联代码片 span class token comment 启动apche2 span systemctl start apache2 在 span class token operator spa
  • linux下安装nodejs(附带安装npm)

    一 下载nodejs的二进制文件 附官网链接 xff1a 下载 Node js 右键 xff0c 复制下载链接地址 二 安装解压 mkdir boke cd boke wget https nodejs org dist v16 13 2
  • stm32F103C8T6核心板 使用ST-Link无法烧写程序的解决方案

    stm32F103C8T6核心板 使用ST Link无法烧写程序的解决方案 本人也是小白一名 希望我的回答能对你有所帮助 以下是我遇到的问题 1 首先是插入连接线 电脑显示如图 网上找了很久还没有找到解决方案 不过不影响烧写 其次是FlyM
  • 【无标题】

    stm32最小核心板串口通讯连接方式 首先需要一个含有CH430的usb转ttl模块 3 3v接板子上的3 3v GND接板子上的GND 注意 不要接反了 接反的话usb转ttl模块不会亮 如果接反了并且usb转ttl模块插到电脑上 板子会
  • selenium 滑块问题解决

    滑块问题解决 问题解决分为两步 图片处理 滑块移动处理 图片处理 1 图片获取 这里获取的是背景以及滑块图片 获取图片 通过requests get 将图片下载到本地 with open 39 yuan image html 39 39 r
  • VisionPro 9.0 安装完,没有在Visual Studio 2019工具箱中上显示控件

    VisionPro 9 0 安装完 没有在Visual Studio 2019工具箱中上显示控件 步骤 右键工具箱 然后点击 选择项 然后点击浏览选项 3 目录位置 C Program Files x86 Cognex VisionPro
  • visionPro通过网线连接海康相机踩过的坑

    visionPro通过网线连接海康相机踩过的坑 1 搞了两三天 xff0c 笔者用的是笔记本是小新 xff0c 没有网口 xff0c 通过USB转网口连接摄像头 xff0c 明确的告诉你不行 xff0c USB即使达到所谓的千兆 xff0c
  • 完成select的TCP客户端

    include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt include lt netinet
  • vins概述

    基本框架如上 xff0c VINS的功能模块可包括五个部分 xff1a 数据预处理 初始化 后端非线性优化 闭环检测及闭环优化 代码中主要开启了四个线程 xff0c 分别是 xff1a 前端图像跟踪 后端非线性优化 xff08 其中初始化和
  • 软件项目管理总结(全)

    软件项目管理知识综述 第一章知识总结 软件项目管理的作用和重要性 项目管理就是将知识 技能 工具与技术应用于项目活动 xff0c 以满足项目的要求 项目管理通过合理 运用与整合特定项目所需的项目管理过程得以实现 项目管理使组织能够有效且高效
  • FreeRTOS 的任务调度方式和具体任务是怎么切换的

    FreeRTOS操作系统主要是两种任务调度方式 xff1a 抢占式调度 每个任务都有不同的优先级 xff0c 任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数 xff0c 比如 vTaskDelay 时间片调度 每个任务都
  • linux/UNIX中如何使用fork函数调用exec函数族,实现子进程做特定操作

    前言 在 Unix Linux 操作系统中 xff0c 进程是一种非常重要的概念 进程是程序执行的实例 xff0c 操作系统会为每个进程分配资源 xff0c 进程之间相互独立 xff0c 可以进行通信 在 Unix Linux 中 xff0