iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >exec()函数在C++中的应用及其用法
  • 400
分享到

exec()函数在C++中的应用及其用法

C++exec()函数C++exec 2023-05-19 14:05:41 400人浏览 独家记忆
摘要

目录前言exec()execl()execlp()前言 fork 函数之后,如果想要把子进程换成一个我想要执行的进程,这时,就不得不使用 exec()函数了,这也是 fork()的意

前言

fork 函数之后,如果想要把子进程换成一个我想要执行的进程,这时,就不得不使用 exec()函数了,这也是 fork()的意义所在。当然,exec系列的函数也可以将当前进程替换掉,不一定非要 fork()一个子进程。常见的 fork()调用例子有很多,比如从 wechat 发起一个语音电话、从 bash 或者zsh执行一个 a.out 程序,都是在利用exec系统调用将新产生的子进程完全替换成目标进程。

比如,这是一个死循环程序(目的是为了观察,让它活得久一点):

#include <stdio.h>
int main() {
    int a = 0;
    while (1) {
        a++;
    }
    return 0;
}

通过编译,执行:

GCc fork_example.c -o fork_example

./fork_example

查看进程:top

可以发现,fork_example的进程的 PPID 为 54861,我们看看它是谁:ps 54861

  PID   TT  STAT      TIME COMMAND
54861 s018  Ss     0:00.23 /bin/zsh -il

很明显,它是 zsh,现在可以终止fork_example: kill 57892

zsh: terminated ./fork_example

程序就会结束!以上例子,可以看到我们的子进程,就是由一个父进程 fork()之后替换的。

exec()

#include<unistd.h>

原型:

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, char *const argv[], char *const envp[])
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])

参数:

path参数表示你要启动程序的名称,包括路径名;

arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名

返回值:成功返回0,失败返回-1

上述exec系列函数底层都是通过execve系统调用实现:

#include <unistd.h>int execve(const char *filename, char *const argv[],char *const envp[]);#include <unistd.h>
int execve(const char *filename, char *const argv[],char *const envp[]);

① 查找方式:上表其中前4个函数的查找方式都是完整的文件目录路径,而最后2个函数(也就是以p结尾的两个函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。

② 参数传递方式:exec函数族的参数传递有两种方式,一种是逐个列举的方式,而另一种则是将所有参数整体构造成指针数组进行传递。

在这里参数传递方式是以函数名的第5位字母来区分的,字母为“l”(list)的表示逐个列举的方式,字母为“v”(vertor)的表示将所有参数整体构造成指针数组传递,然后将该数组的首地址当做参数传给它,数组中的最后一个指针要求是NULL。读者可以观察execl、execle、execlp的语法与execv、execve、execvp的区别。

③ 环境变量:exec函数族使用了系统默认的环境变量,也可以传入指定的环境变量。这里以“e”(environment)结尾的两个函数execle、execve就可以在envp[]中指定当前进程所使用的环境变量替换掉该进程继承的所以环境变量,这极大地提供了灵活度。

execl()

该函数的定义为:

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

可以看到,它的参数为一个 path,由于不带 p,因此,最后一个参数为 NULL

例如:

#include <stdio.h>
#include <unistd.h>
int main() {
    printf("hello!\n");
    // 替换 main 进程
    execl("/bin/ls", "ls", "-a", NULL);
    // Good bye! 并不会被打印出来
    printf("good bye!\n");
    return 0;
}

执行结果:

hello!
.               a.out           execlp.c        fork_example    myshell.c
..              execl.c         fork.c          fork_example.c

可以看到,它成功地执行了"ls -a"命令。

execlp()

该函数的定义为:

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

该函数带 p,第一个参数是一个 *file,说明不需要带完整路径,它会在默认环境变量里面自动查找:

#include <stdio.h>
#include <unistd.h>
int main() {
    printf("hello!\n");
    // 替换 main 进程
    execl("ls","ls", "-a", NULL);
    // good bye! 并不会被打印出来
    printf("good bye!\n");
    return 0;
}

运行结果:

hello!
good bye!

说明,并没有成功替换,这是我们带个 p:

#include <stdio.h>
#include <unistd.h>
int main() {
    printf("hello!\n");
    // 替换 main 进程
    execlp("ls","ls", "-a", NULL);
    // good bye! 并不会被打印出来
    printf("good bye!\n");
    return 0;
}

运行结果:

hello!
.               a.out           execlp.c        fork_example    myshell.c
..              execl.c         fork.c          fork_example.c

成功替换!其它的函数也是同理,就不再赘述了。

到此这篇关于exec()函数在c++中的应用及其用法的文章就介绍到这了,更多相关C++ exec()函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: exec()函数在C++中的应用及其用法

本文链接: https://www.lsjlt.com/news/213329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • exec()函数在C++中的应用及其用法
    目录前言exec()execl()execlp()前言 fork 函数之后,如果想要把子进程换成一个我想要执行的进程,这时,就不得不使用 exec()函数了,这也是 fork()的意...
    99+
    2023-05-19
    C++ exec()函数 C++ exec
  • fgets函数及其用法,C语言fgets函数详解
    fgets函数是C语言中用来从指定的流中读取一行数据的函数。它的原型如下:```cchar *fgets(char *str, in...
    99+
    2023-09-09
    C语言
  • C/C++中虚函数详解及其作用介绍
    目录概述使用方法关联静态关联动态关联案例1未使用虚函数使用虚拟类案例2总结概述 虚函数 (virtual function) 指可以被子类继承和覆盖的函数. 使用方法 基类声明成员...
    99+
    2024-04-02
  • fseek()函数的用法及其理解
    fseek()函数是C语言中的文件操作函数,用于设置文件指针的位置。它的原型如下:int fseek(FILE *stream, l...
    99+
    2023-09-09
    fseek()
  • C++ 递归函数在数学归纳法中的应用?
    数学归纳法通过递归函数在 c++++ 中得以实现,通过证明基本情况和归纳步骤,即可证明给定的命题对所有自然数成立。例如,上述代码证明了“所有自然数 n,n^2 + n + 41 是素数”...
    99+
    2024-04-19
    c++ 递归
  • C++ 递归函数在排序算法中的应用?
    c++++ 中递归函数在排序算法中的应用通过递归函数实现的插入排序和归并排序算法,可以将复杂的问题分解为更小的子问题,并通过递归调用高效地解决。插入排序:通过逐个插入元素,将数组有序化。...
    99+
    2024-04-17
    c++ 递归函数
  • C++ 递归函数在回溯算法中的应用?
    递归函数在回溯算法中通过深度优先搜索决策树来解决问题:函数调用自身,探索决策树的分支。针对问题,函数会不断深入探索树状结构,并在做出错误决策后进行回溯。实战案例:八皇后问题中,函数通过递...
    99+
    2024-04-24
    递归函数 回溯算法 c++
  • C++ 递归函数在分治算法中的应用?
    分治算法将大问题分解成较小子问题,c++++递归函数可实现分治算法:选择基准元素;分割数组为基准元素两侧;递归排序两部分;合并已排序部分。 C++ 递归函数在分治算法中的应用 分治算法...
    99+
    2024-04-19
    c++ 递归函数 分治算法
  • C++ 递归函数在搜索算法中的应用?
    递归函数在搜索算法中用于探索树状数据结构。深度优先搜索使用堆栈探索节点,而广度优先搜索使用队列按层遍历。在实际应用中,如查找文件中,递归函数可用于在指定目录中搜索给定文件。 C++ 递...
    99+
    2024-04-17
    c++ 递归函数 搜索算法
  • C++ 递归函数在生成函数中的应用?
    递归函数在生成函数中用于通过重复式生成序列。这些函数通过调用自身并解决更小的实例来解决复杂问题。在生成函数中,它们帮助定义序列生成规则,例如生成斐波那契数列或素数列表。递归函数提供了一种...
    99+
    2024-04-23
    c++ 递归函数 质数
  • Node.js 中 WebSocket 及其在实时应用程序中的应用
    简介: WebSocket 是一个双向的实时通信协议,非常适合创建交互式和响应迅速的 Web 应用程序。在 Node.js 中,可以使用 WebSocket 库来轻松实现 WebSocket 支持。 Node.js 中的 WebSocke...
    99+
    2024-03-01
    WebSocket、实时应用程序、Node.js、Socket.IO、WebSocket.js
  • Python中函数的定义及其调用
    一、函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封...
    99+
    2024-04-02
  • PHP函数及其用途
    PHP是一种流行的服务器端编程语言,它具有广泛的适用性,从简单的Web表单到大型企业级应用程序都可以使用。作为一个开源的编程语言,PHP有许多功能强大的函数,这些函数可以完成各种任务,从字符串处理到图形处理,再到数据库访问。在本文中,我们将...
    99+
    2023-05-23
    PHP函数 用途 编程
  • 深入剖析numpy函数库的核心函数及其应用
    深入研究numpy函数:解析numpy库的核心函数及其应用 引言: NumPy(Numerical Python)是Python科学计算的基础库之一,它提供了高效的多维数组(ndarray)对象和一系列数学函数,使得我们可以在P...
    99+
    2024-01-26
    应用 解析 numpy函数
  • 有哪些常用的PHP函数,及其应用场景?
    php 提供丰富的函数库,包括:字符串操作函数: 获取长度、转换大小写、替换字符、拆分字符串。数学函数: 获取绝对值、四舍五入、求最大最小值、计算幂。日期和时间函数: 显示当前时间、返回...
    99+
    2024-04-18
    php 常用函数
  • JavaMorris遍历算法及其在二叉树中的应用
    目录一.Morris遍历1.什么是Morris遍历2.基本思想3.Morris遍历的优点和缺点4.二叉树的线索化二.中序Morris遍历1.中序Morris遍历的分析2.中序Morr...
    99+
    2023-05-18
    Java Morris遍历算法 Java Morris遍历
  • Spark Streaming及其在实时数据处理中的应用
    Spark Streaming是Apache Spark提供的一种实时流处理框架,可以对实时数据进行高效的处理和分析。它可以将数据流...
    99+
    2024-03-05
    Spark
  • C++中构造函数与析构函数的详解及其作用介绍
    目录构造函数默认构造函数有参构造函数析构函数析构函数例子析构函数执行时机局部对象全局对象构造函数 构造函数 (constructor) 是一种特殊的成员函数. 它会在每次创建类的新对...
    99+
    2024-04-02
  • Golang中常用的密码算法及其应用
    Golang中常用的密码算法及其应用 密码算法在软件开发过程中起着至关重要的作用,保护用户数据的安全。Golang作为一种流行的程序设计语言,也提供了多种密码算法供开发者使用。本文将介...
    99+
    2024-03-03
    常用算法
  • C语言中函数的介绍及用法
    本篇内容介绍了“C语言中函数的介绍及用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录函数定义库函数定义介绍Example 1 strc...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作