IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【进程】(四)exec族函数 -> 正文阅读

[C++知识库]【进程】(四)exec族函数

1、函数原型

#include <unistd.h>
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 execvpe(const char *file, char *const argv[],char *const envp[]);

execl,execlp参数尾部要以NULL结束
execv,execvp参数数组argv[]要以NULL结束

2、函数说明

exec族成员函数说明
execll 表示list参数列表,其函数寻找可执行文件路径时,不访问环境变量
execlpl 表示list参数列表,execlp将在环境变量中寻找可执行文件
execvv表示char *argv[]指针数组,可将可执行文件所带参数放入数组中集中表示
execvp在execv的基础上,p表示path ,将访问环境变量
execle带e表示该函数取envp[]数组,而不使用当前环境
execvpe带e表示该函数取envp[]数组,而不使用当前环境

3、例程代码

3.1 execl(execlp)

3.1.1 主程序(execl.c)

gcc execl.c -o execl

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <errno.h>

int main(void)
{
        pid_t pid;
        int cmd;
        while(1)
        {
                printf("waitting client cmd...\r\n");
                scanf("%d", &cmd); //等待用户键入命令,模拟服务端接收客户端发送的请求指令
                if(cmd == 1)
                {
                        printf("client request service\r\n");
                        if((pid = fork()) < 0)
                        {
                                perror("fork failed,Why:");
                        }
                        else if(pid > 0)
                        {
                                wait(NULL);//等待子进程执行完毕
                                printf("run finished.\r\n");
                        }
                        else if(pid ==  0)
                        {
                                printf("fork sucess");
                                /* 调用execl替代子进程,./execl_task为可执行文件所在路径名。
                                 * 当在相对路径找不到可执行文件名时,不访问环境变量。
                                 * execlp用法相同,所指定的路径找不到可执行文件时,将访问全局变量*/
                                if(execl("./execl_task", "execl_task", "arg[1]", "arg[2]", NULL) == -1)
                                {
									perror("execl failed,why:");
								}
                        }
                }else{
                        printf("no client request\r\n");
                }
        }
        exit(0);
}

3.1.2 指定execl目标程序(execl_task)

gcc execl_task.c -o execl_task

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

int main(int argc, char *argv[])
{
        pid_t pid;
        printf("%d\n", argc);
        if(argc != 3)
        {
                perror("argc is fewer");
                exit(0);
        }
        for(int i=0; i<argc; i++) //打印execl函数传递的参数
        {
                printf("%s ", argv[i]);
        }
        printf("\n");
        exit(0);
}

3.2 execv(execvp)

3.2.1 类比execl(execlp)

execv(execvp)与execl(execlp)的区别在于函数参数不同,execv将可执行文件的目标参数打包成数组,

int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);

3.2.2 主程序(execv.c)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <errno.h>

int main(void)
{
        pid_t pid;
        int cmd;
        //打包execv(execvp)所指的可执行文件所带参数
        char *argv[] = {"execl_task", "arg[1]", "arg[2]", NULL};
        while(1)
        {
                printf("waitting client cmd...\r\n");
                scanf("%d", &cmd); //等待用户键入命令,模拟服务端接收客户端发送的请求指令
                if(cmd == 1)
                {
                        printf("client request service\r\n");
                        if((pid = fork()) < 0)
                        {
                                perror("fork failed,Why:");
                        }
                        else if(pid > 0)
                        {
                                wait(NULL);//等待子进程执行完毕
                                printf("run finished.\r\n");
                        }
                        else if(pid ==  0)
                        {
                                printf("fork sucess");
                                /* 调用execl替代子进程,./execl_task为可执行文件所在路径名。
                                 * 当在相对路径找不到可执行文件名时,不访问环境变量。
                                 * execvp用法相同,所指定的路径找不到可执行文件时,将访问全局变量*/
                                if(execv("./execl_task", argv) == -1)
                                {
                                	perror("execv failed,why:");
								}
                        }
                }else{
                        printf("no client request\r\n");
                }
        }
        exit(0);
}

3.2.3 execv目标程序execv_task

gcc execv_task.c -o execv_task

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

int main(int argc, char *argv[])
{
        pid_t pid;
        printf("%d\n", argc);
        if(argc != 3)
        {
                perror("argc is fewer");
                exit(0);
        }
        for(int i=0; i<argc; i++) //打印execl函数传递的参数
        {
                printf("%s ", argv[i]);
        }
        printf("\n");
        exit(0);
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:30:29  更:2022-03-21 20:31:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:09:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码