2.6exec函数族

子进程替换与环境变量:execl与execlp详解
本文详细介绍了C语言中的execl和execlp函数,讲述了它们在子进程启动中的应用,包括文件路径查找、参数传递以及执行失败的返回机制。重点讲解了如何通过这两个函数替换子进程代码并利用环境变量寻找可执行文件。

函数族:一系列功能相同或相似的函数

p是代表到环境变量中找,e表示给程序新的环境变量。

前六个是标准c库函数,最后一个是linux库函数

常用execl和execlp

1.execl函数

子进程的代码被替换掉

 

/*
    #include <unistd.h>
    extern char **environ;
    int execl(const char *path, const char *arg, ...);
        -参数:
            -path:需要指定的执行的文件的路径或名称
                相对路径:a.out 绝对路径:/hone/ethan/a.out 推荐使用绝对路径

            -arg:是执行可执行文件苏需要的参数列表
                第一个参数一般没有什么作用为了方便,一般写的是执行的程序的名称
                从第二个参数开始往后,就是程序执行所需要的参数列表
                参数最后需要以NULL结束(哨兵)
                类似./a.out hello
        -返回值:
            只有当调用失败,才会有返回值,返回-1,并且设置errno
            
*/
#include <unistd.h>
#include <stdio.h>
int main(){
    //创建一个子进程,在子进程中执行exec函数族中的函数
    pid_t pid = fork();
    if(pid>0){
        //父进程
        printf("i am parent process, pid : %d\n",getpid());
        sleep(1);
    }
    else if(pid==0){
        //子进程
        //execl("/home/ethan/Linux/lesson19/hello","hello",NULL);

        //shell命令执行
        execl("/bin/ps","ps","aux",NULL);
        printf("i am child process pid = %d\n",getpid());
    }
    
    for(int i=0;i<3;i++)
    {
        printf("i = %d, pid = %d\n",i,getpid());
    }
    return 0;
}

2.execlp函数: 

/*
    #include <unistd.h>
    extern char **environ;
        int execlp(const char *file, const char *arg, ...);
        -会到环境变量中查找指定的可执行文件,如果找到了就执行,找不到就执行不成功
        -参数:
            -file:需要执行的可执行的文件名
                a.out
                ps

            -arg:是执行可执行文件苏需要的参数列表
                第一个参数一般没有什么作用为了方便,一般写的是执行的程序的名称
                从第二个参数开始往后,就是程序执行所需要的参数列表
                参数最后需要以NULL结束(哨兵)
                类似./a.out hello
        -返回值:
            只有当调用失败,才会有返回值,返回-1,并且设置errno
            
*/
#include <unistd.h>
#include <stdio.h>
int main(){
    //创建一个子进程,在子进程中执行exec函数族中的函数
    pid_t pid = fork();
    if(pid>0){
        //父进程
        printf("i am parent process, pid : %d\n",getpid());
        sleep(1);
    }
    else if(pid==0){
        //shell命令执行
        execlp("ps","ps","aux",NULL);
        //如果是hello自己写的代码由于环境变量中没有会出错
        printf("i am child process pid = %d\n",getpid());
    }
    
    for(int i=0;i<3;i++)
    {
        printf("i = %d, pid = %d\n",i,getpid());
    }
    return 0;
}

### ESP01烧录教程及相关指南 ESP01 是一款基于 ESP8266 的 Wi-Fi 模块,广泛应用于物联网设备开发中。以下是关于如何成功完成 ESP01 固件烧录的过程说明。 #### 工具准备 为了实现 ESP01 的固件刷入操作,需准备好以下工具和材料: - **硬件部分**:USB 转串口模块(支持 CH340 或 CP2102)、ESP01 模块、杜邦线若干。 - **软件部分**:电脑端安装驱动程序(CH340 驱动或 CP2102 驱动),以及用于固件烧写的工具 `esptool.py`[^1]。 #### 环境配置与连接设置 在开始之前,请确认 USB 转串口模块已正确识别,并分配有对应的 COM 口编号。随后按照如下方式连接 ESP01 和 USB-TTL 模块: | ESP01 Pin | USB-TTL Pin | |-----------|-------------| | GND | GND | | TX | RX | | RX | TX | | VCC | 3.3V (切勿接5V!) | 注意,在实际烧写过程中还需要短接 GPIO0 至 GND 来进入下载模式[^2]。 #### 使用 esptool 进行固件烧录 确保 Python 环境已经搭建完毕之后,可以通过 pip 安装最新版本的 esptool 库: ```bash pip install --upgrade esptool ``` 执行擦除芯片命令前先清空原有数据以防冲突发生: ```bash esptool.py --port COMX erase_flash ``` 接着上传目标固件文件至指定地址(通常为偏移量 0x0000),假设本地路径下存在名为 firmware.bin 的二进制镜像,则运行下面这条语句即可完成整个流程: ```bash esptool.py --chip esp8266 --port COMX write_flash 0x0000 firmware.bin ``` 以上步骤均应严格按照官方文档指示逐步实施以减少失败几率。 #### 常见问题排查技巧 如果遇到诸如“Failed to connect”之类的提示信息时,可以尝试调整波特率参数或者重新插拔设备来改善接触状况;另外也要留意供电电压是否稳定充足等问题。 对于希望进一步了解 MQTT 协议通信机制的朋友来说,可参考另一份资料学习如何利用 AT 指令集构建简单的发布订阅模型实例[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值