与进程相关的系统调用-exec函数(库函数)、dup函数(系统调用函数)

2024-02-02 16:48

本文主要是介绍与进程相关的系统调用-exec函数(库函数)、dup函数(系统调用函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

exec函数

fork在创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数,便于函数执行另一种程序,当进程调用一种exec函数,该进程的用户代码空间和数据完全被新进程所替换,从新程序的启动例程开始执行,调用exec并不产生新的进程,所以调用exec函数之后进程的id没变化;

头文件

 #include <unistd.h>

函数实现

extern char **environ;//环境变量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[]);

其中,参数path为可执行文件路径,argv[]为命令行参数。

eg:

execlp函数

l:list 表

加载一个进程,借助PATH环境变量
int execlp(const char *file, const .char *arg, ...);
成功:无返回;失败: -1
参数1:要加载的程序的名字。该函数需要配合PATH环境变量来使用,当PATH中所有目录搜索后没有参
数1则出错返回。
该函数通常用来调用系统程序。如: Is、date、cp、cat 等命令。

execl函数

加载一个进程,通过 路径+程序名来加载。
int execl(const char *path, const char *arg, ...);
成功:无返回;失败: -1
对比exelp,如加载"Is"命令带有1, -F 参数
exedp("Is", "Is",.", "-F", NULL);使用程序名 在PATH中搜索。
execd("/bin/Is", "Is",-", "-F", NULL);
使用参数1给出的绝对路径搜索。

在这里插入图片描述
在这里插入图片描述
这里在以execv为主要介绍对象吧 ,其他函数类似的用法相同:

如果一个进程调用了execv(),那么该函数便会把函数参数path所指定的可执行文件加载到进程的用户内存空间,并覆盖掉原文件,然后便运行这个新加载的可执行文件。

在实际应用中,通常调用execv()的都是子进程。人们之所以创建一个子进程,其目的就是执行一个与父进程代码不同的程序,而系统调用execv()就是子进程执行一个新程序的手段之一。子进程调用execv()之后,系统会立即为子进程加载可执行文件分配私有程序内存空间,从此子进程也成为一个真正的进程。

这里我看到别人写的很有意思,就粘贴过来:如果说子进程是父进程的“儿子”,那么子进程在调用execv()之前,它所具有的单独用户堆栈和数据区也仅相当于它的私有“房间”;但因它还没有自己的“住房”,因此也只能寄住在“父亲”家,而不能“自立门户”,尽管它有自己的“户口”(进程控制块)。

调用execv()后,父进程与子进程存储结构的示意图如下:
在这里插入图片描述

exec函数一旦调用成功即执行新的程序,不返回。只有失败才返回,错误值-1。所以通常我们直接在exec函数
调用后直接谓用perror()和exit),无需if判断。
1 (it)
命令行参数列表
p (path)
搜素file时使用path变量
v (vector)
使用命令行参数数组
e (environment)
使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量
事实上,只有execve.是真正的系统调用,其它五个函数最终都调用execve,所以execve,在man手册第2节,
其它函数在man手册第3节。

execve 函数族的作用是,根据指定的文件名找到可执行文件,并将其关联到调用exec族函数的进程,从而使进程执行该可执行文件。简单地说,就是用execve族函数加载的程序文件代替该进程原来的程序文件。
在这里插入图片描述
与一般的函数不同,exec族函数执行成功后一般不会返回调用点,因为它运行了一个新的程序,进程的代码段、数据段和堆栈等都已经被新的数据所取代,只留下进程ID等一些表面信息仍保持原样,虽然还是旧的躯壳,但是其实质内容已经全部变化了。只有调用失败了,它们才会返回一个-1,从原程序的调用点接着往下执行。

dup函数(系统调用函数)

dup, dup2, dup3 - duplicate a file descriptor//文件读写位置定位函数
本来是写在这个文件里面,重定位可以写到另一个文件里面;

作用:对文件描述符的拷贝;

头文件

#include <unistd.h>

函数实现

int dup(int oldfd);
int dup2(int oldfd, int newfd);#define _GNU_SOURCE
#include <unistd.h>int dup3(int oldfd, int newfd, int flags);

功能:复制文件描述符,使多个文件描述符指向同一个文件。

返回值:

成功:dup函数返回当前系统可用的最小整数值。 dup2函数返回第一个不小于newfd的整数值。也就是分为两种情况: ①、如果newfd已经打开,则先将其关闭,再复制文件描述符。 ②、如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。失败:均返回-1,并设置errno。注意:通过dup和dup2创建的文件描述符并不继承原文件描述符的属性。比如close-on-exec和non-blocking

这篇关于与进程相关的系统调用-exec函数(库函数)、dup函数(系统调用函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671345

相关文章

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python Excel 通用筛选函数的实现

《PythonExcel通用筛选函数的实现》本文主要介绍了PythonExcel通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录案例目的示例数据假定数据来源是字典优化:通用CSV数据处理函数使用说明使用示例注意事项案例目的第一

C#使用SendMessage实现进程间通信的示例代码

《C#使用SendMessage实现进程间通信的示例代码》在软件开发中,进程间通信(IPC)是关键技术之一,C#通过调用WindowsAPI的SendMessage函数实现这一功能,本文将通过实例介绍... 目录第一章:SendMessage的底层原理揭秘第二章:构建跨进程通信桥梁2.1 定义通信协议2.2

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境