【Linux系统编程】22.exec函数、execlp、execl、execvp

news2024/12/24 3:24:51

目录

exec函数

execlp

参数file

返回值

测试代码1

测试结果

execl

测试代码2

测试结果

execvp

测试代码3

测试结果

exec函数

        fork创建子进程后执行的是和父进程相同的程序,但有可能执行不同的代码分支,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。将当前进程的.text、.data替换为所要加载的程序的.text、.data,然后让进程从新的.text第一条指令开始执行,但进程ID不变,换核不换壳。

        有六种以exec开头的函数,统称exec函数。

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

execlp

借助PATH环境变量,加载新的程序。

int execlp(const char *file, const char *arg, ...);

参数file

        要加载的程序的名字。该函数需要配合 PATH 环境变量来使用,当PATH中所有目录搜索后没有参数file则出错返回。该函数通常用来调用系统程序。如:ls、date、cp、cat等命令。

返回值

成功:不返回

失败:返回-1

测试代码1

使用子进程执行ls -al命令。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    printf("程序开始运行!\n");
    printf("当前进程的ID是%d。\n", getpid());
    pid_t jin_cheng = fork();
    if (jin_cheng < 0)
    {
        perror("创建进程错误!");
        exit(1);
    }
    else if (jin_cheng == 0)
    {
        execlp("ls","ls","-a","-l",NULL);//支持多个参数传入的函数,使用NULL作参数传入结束符,相当于哨兵
        perror("进程错误!");
        exit(1);
    }
    else if (jin_cheng > 0)
    {
        sleep(1);
        printf("这是父进程,当前进程的ID是%d。\n", getpid());
        printf("父程序结束!\n");
    }
    return 0;
}

测试结果

execl

加载一个进程, 通过路径+程序名来加载。

int execl(const char *path, const char *arg, ...);

测试代码2

/*
CeShi2_1.c
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    printf("程序开始运行!\n");
    printf("当前进程的ID是%d。\n", getpid());
    pid_t jin_cheng = fork();
    if (jin_cheng < 0)
    {
        perror("创建进程错误!");
        exit(1);
    }
    else if (jin_cheng == 0)
    {
        execlp("./CeShi2_2", "./CeShi2_2", NULL); //支持多个参数传入的函数,使用NULL作参数传入结束符
        perror("进程错误!");
        exit(1);
    }
    else if (jin_cheng > 0)
    {
        sleep(1);
        printf("这是父进程,当前进程的ID是%d。\n", getpid());
        printf("父程序结束!\n");
    }
    return 0;
}
/*
CeShi2_2.c
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    printf("这是子进程,当前进程的ID是%d,你好,世界!\n", getpid());
    return 0;
}

测试结果

execvp

加载一个进程,使用自定义环境变量env。封装执行命令。同样需要配合环境变量进行使用。

int execvp(const char *file, char *const argv[]);

测试代码3

使用execvp函数实现,使用子进程执行ls -al命令。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    printf("程序开始运行!\n");
    printf("当前进程的ID是%d。\n", getpid());
    pid_t jin_cheng = fork();
    if (jin_cheng < 0)
    {
        perror("创建进程错误!");
        exit(1);
    }
    else if (jin_cheng == 0)
    {
        char *argv[] = {"ls", "-a", "-l", NULL};
        execvp("ls", argv);
        perror("进程错误!");
        exit(1);
    }
    else if (jin_cheng > 0)
    {
        sleep(1);
        printf("这是父进程,当前进程的ID是%d。\n", getpid());
        printf("父程序结束!\n");
    }
    return 0;
}

测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Vue2.X/Vue3.X项目引入jQuery,以及增加jQuery.easing扩展?让你的动画效果更加丝滑!

前言 还记得在2015左右&#xff0c;网页开发依然是jQuery的天下&#xff0c;虽然Vue、React开始盛行&#xff0c;以及后面Angular也开始抢占市场&#xff0c;但是jQuery在市场上依然占有较大的比重。当时的html页面大多是用jQuery来写的&#xff0c;为jQuery设计的插件也是相当…

应用层协议——TCP(上)

文章目录 1. TCP协议1.1 TCP协议段格式1.2 确认应答(ACK)机制1.3 16位窗口大小1.4 6位标志位1.4.1 TCP三次握手 1.5 确认应答(ACK)机制1.6 超时重传机制1.7 连接管理机制1.7.1 理解TIME_WAIT状态1.7.2 理解 CLOSE_WAIT 状态 1. TCP协议 TCP全称为传输控制协议&#xff0c;意思…

双端口存储器原理实验

1.实验目的及要求 1.1实验目的 1&#xff09;了解双端口静态随机存储器IDT7132的工作特性及使用方法。 2&#xff09;了解半导体存储器怎样存储和读出数据。 3&#xff09;了解双端口存储器怎样并行读写&#xff0c;并分析冲突产生的情况。 1.2实验要求 1&#xff09;做好…

百度屏蔽词有哪些?其中就有移民关键词指数被屏蔽?

我是百收网SEO&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 今日tombkeeper消息爆料&#xff1a;百度指数已经屏蔽“移民”等关键词指数。 大家好&#xff0c;我是百收网SEO商学院的狂潮微课老师&#xff0c;今天我们来讲解第 12 节课关键词优化难度分析…

JZ39数组中出现次数超过一半的数字

题目地址&#xff1a;数组中出现次数超过一半的数字_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 最简单用哈希表来记录每个数字在数组中出现的次数&#xff0c;在遍历这个数组时同时进行判断是否满足条件。 整体代码&#xff1a; public int MoreThanHalfNum…

腾讯云服务器竞价实例是什么意思?CVM计费模式选择说明

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…

【MySQL】MySQL不走索引的情况分析

未建立索引 当数据表没有设计相关索引时&#xff0c;查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…

C++多态与虚函数的原理与关系

C多态 多态可以分为编译时的多态和运行时的多态。前者主要是指 函数的重载&#xff08;包括运算符的重载&#xff09;、对重载函数的调用&#xff0c;在编译时就能根据实参确定应该调用哪个函数&#xff0c;因此叫编译时的多态&#xff1b;而后者则和继承、虚函数等概念有关。…

智慧交通项目实战全流程-DeepSort多目标跟踪车道线检测

1. 项目介绍 2. 算法库 2.1 numba介绍 numba是⼀个⽤于编译Python数组和数值计算函数的编译器&#xff0c;这个编译器能够⼤幅提⾼直接使⽤Python编写的函数的运算速度。 使用方法 numba对代码进⾏加速时&#xff0c;给要优化的函数加上jit优化器即可。使⽤jit的时候可以让…

IDEA断点调试(debug)

目录 1.断点调试介绍 2.F8逐行执行代码 3.调试遇异常 4.调试时如何看源码 5.如何直接执行到下一个断点 F9 6.利用断点调试查看动态绑定机制 1.断点调试介绍 断点调试是指在程序的某一行设置一个断点&#xff0c;调试时&#xff0c;程序运行到这一 行就会停住&#xff0…

2023年国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

【Rust日报】2023-08-11 candle:一个极简的Rust机器学习框架

Bevys Third Birthday Bevy 是一个用 Rust 构建的令人耳目一新的数据驱动的游戏引擎&#xff0c;如果你想学习如何使用 Bevy 制作 2D/3D 游戏、可视化、用户界面或其他图形应用程序&#xff0c;那可以访问Bevy官网去了解更多。 阅读原文&#xff1a;https://bevyengine.org/new…

GPU Microarch 学习笔记 [1]

WARP GPU的线程从thread grid 到thread block&#xff0c;一个thread block在CUDA Core上执行时&#xff0c;会分成warp执行&#xff0c;warp的颗粒度是32个线程。比如一个thread block可能有1024个线程&#xff0c;分成32个warp执行。 上图的CTA&#xff08;cooperative thre…

西门子PLC模拟量接线及程序

接线 2线制接线 3线制接线 4线制接线 程序 指令 S_ITR 输入参数 EN 使能信号 AIW0 模拟量通道 ISH ISL 0-20ma对应 0-32000 4-20ma 对应 6400-32000 OSH OSL 传感器的测量值的最大和最小值 300 和 -50 输出参数 VD0 当前的测量温度

docker部署springboot

基础知识 什么是docker 官网&#xff1a; Docker Docs: How to build, share, and run applications | Docker Documentation Docker 是一个基于go语言开发的开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到…

Unity 鼠标实现对物体的移动、缩放、旋转

文章目录 1. 代码2. 测试场景 1. 代码 using UnityEngine;public class ObjectManipulation : MonoBehaviour {// 缩放比例限制public float MinScale 0.2f;public float MaxScale 3.0f;// 缩放速率private float scaleRate 1f;// 新尺寸private float newScale;// 射线pri…

简绘ChatGPT支持Midjourney绘图 支持stable diffusion绘图

简绘支持Midjourney绘图和stable diffusion绘图。 这意味着简绘具备Midjourney绘图和stable diffusion绘图功能的支持。

分支语句和循环语句(1)

这篇文章我们详细的把分支语句和循环语句给大家进行讲解。 分支语句&#xff1a; if switch 循环语句&#xff1a; while for do while goto语句&#xff1a; 1.什么是语句&#xff1f; C语句可分为以下五类&#xff1a; 1. 表达式语句 2. 函数调用语句 3. 控制…

k8s常用资源管理 控制

目录 Pod&#xff08;容器组&#xff09;&#xff1a;Pod是Kubernetes中最小的部署单元&#xff0c;可以包含一个或多个容器。Pod提供了一种逻辑上的封装&#xff0c;使得容器可以一起共享网络和存储资源 1、创建一个pod 2、pod管理 pod操作 目录 创建Pod会很慢 Pod&…