首页 > 编程语言 >C++中的exec()函数

C++中的exec()函数

时间:2023-07-29 21:04:19浏览次数:36  
标签:fork const 函数 exec int C++ char

exec()函数在C++中是一个进程控制函数,用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程的代码和数据,创建新的进程运行其他程序。exec()函数有多个版本,例如execl、execv、execle、execve等,根据不同的参数类型和个数来使用。

前言

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

C++中的exec()函数_#include

可以发现,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"命令。

标签:fork,const,函数,exec,int,C++,char
From: https://blog.51cto.com/u_15641375/6895139

相关文章

  • C++实现简单的ls命令以及原理
    C++实现简单的ls命令及其原理,C++实现ls命令可通过调用系统函数实现读取目录中的文件名和属性,再通过标准输出进行显示。对控制参数的处理一共有7个可选参数,分别是-a、-l、-R、-t、-r、-i、-s,这些参数可以相互自由组合,因此可以设计一种机制,就是直接把它们全部用循环一次性做或运算,......
  • C++实现工资管理中的随机教师信息生成功能
    使用C++实现工资管理中的随机教师信息生成功能,想要做一个教师工资管理系统,就必须得准备好数据,但是这些数据如果用手一行一行地敲,那么工作量是非常大的,因此,我就产生了用C语言实现直接生成大量的教师基本信息的想法,需要的朋友可以参考下。教师的基本信息typedefstructteacher{......
  • 2.3 HLSL常用函数
    1.基本数学运算函数含义示例图min(a,b)返回a、b中较小的数值mul(a,b)两数相乘用于矩阵计算max(a,b)返回a、b中较大的数值abs(a)返回a的绝对值round(x)返回与x最近的整数sqrt(x)返回x的平方根rsqrt(x)返回x平方根的倒数degregee(x)转换成弧度redians(x)将角度转为弧度制noise(x)噪声......
  • HuggingFace | HuggingFace中from_pretrained函数的加载
    我们使用huggingface的from_pretrained()函数加载模型和tokenizer,那么加载这些需要什么文件?加载模型测试代码:如果加载成功,就打印1。fromtransformersimportAutoModelForMaskedLMmodel=AutoModelForMaskedLM.from_pretrained("./bert-base-chinese")print(1)文件目......
  • 无涯教程-jQuery - Accordion组件函数
    小部件手风琴功能可与JqueryUI中的小部件一起使用。手风琴与Tabs相同,当用户单击标题以展开分成逻辑部分的内容时,Accordion与Tabs相同。Accordion-语法这是使用手风琴的简单语法-$(function(){$("#accordion").accordion();});Accordion-示例以下是显示手风琴用......
  • 笔记|《面向对象编程技术与方法(C++)》电子工业出版社
    第一章概述C++多态:https://blog.csdn.net/K346K346/article/details/82774937第二章编程基础数据类型枚举:https://www.runoob.com/w3cnote/cpp-enum-intro.html联合:https://www.runoob.com/cprogramming/c-unions.html作用域运算符:c++入门学习篇(1)之::作用域符解析c++条......
  • 【d2l】【常见函数】【19】 torch.squeeze( ), torch.unsqueeze( )
    torch.squeeze()压缩大小为1的维度参考:https://pytorch.org/docs/stable/generated/torch.squeeze.htmltorch.unsqueeze()在指定的维度处增加一个维度,大小为1参考:https://pytorch.org/docs/stable/generated/torch.unsqueeze.html......
  • 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES
    MySQL的加解密及压缩函数许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARY或BLOB二进制字符串数据类型的列。这避免了删除尾随空格或转换字符集可能改变数据值的潜在问题,例如使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)时可能发......
  • 无涯教程-jQuery - Sortable排序函数
    能够排序功能可与JqueryUI中的交互配合使用。此功能可在任何DOM元素上启用可排序功能。单击并将其拖动到列表中的新位置,其他项将调整以适合。默认情况下,可排序项目共享可拖动属性。Sortable-语法$(function(){$("#sortable").sortable();$("#sortable").disabl......
  • Hive12---日期时间函数的操作
    Intro    时间函数的一些操作,记录之。备查当前时间frompyspark.sqlimportSparkSessionfrompyspark.sqlimportfunctionsasFfrompyspark.sql.typesimportDoubleType,IntegerType,StringTypedefget_or_create(app_name):spark=(SparkSession.buil......