当前位置: 首页 > article >正文

Linux-----进程处理(execve执行可执行文件)

目录

 execve介绍

 execve+fork


 execve介绍

     * const char *__pathL:执行程序的路径
     * char *const __argv[]: 对应执行程序main函数的参数
     * char *const __envp[]:传递的环境变量
     *      (1):第一个参数固定是程序的名称->执行程序的路径
     *      (2):执行程序需要传入的参数
     *      (3):最后一个参数一定是NULL
     * int execve (const char *__path, char *const __argv[],char *const __envp[])
     * return 返回值
     * 跳转之后只有进程的信息保留了下来,其他变量的相关东西都删除了

 execve+fork

 创建execve.c文件,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{

    // 跳转之前
    char* dad = "Fitz";
    printf("我是%s,进程号:%d,此时是一楼\n", dad, getpid());

    //执行跳转
    /**
     * const char *__pathL:执行程序的路径
     * char *const __argv[]: 对应执行程序main函数的参数
     * char *const __envp[]:传递的环境变量
     *      (1):第一个参数固定是程序的名称->执行程序的路径
     *      (2):执行程序需要传入的参数
     *      (3):最后一个参数一定是NULL
     * int execve (const char *__path, char *const __argv[],char *const __envp[])
     * return 返回值
     * 跳转之后只有进程的信息保留了下来,其他变量的相关东西都删除了
     * **/
    __pid_t pid = fork();
    if (pid == -1) {
        printf("创建进程失败\n");
    }
    else if (pid == 0) {
        char* son = "hhh";
        char* args[] = { "/home/hwj/C++/system/execve_1/build/main" ,son,NULL };
        char* envs[] = { NULL };
        int re = execve(args[0], args, envs);
        if (re == -1) {
            printf("跳转失败\n");
            return 1;
        }
        printf("fuck\n");
    }
    else {
        
        printf("我是父进程,pid为:%d,我的子进程pid:%d\n", getpid(), pid);
    }
    return 0;
}

main.c代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{

    if (argc < 2) {
        printf("参数不够\n");
        return 0;
    }
    printf("我是%s,进程号:%d,父进程id:%d,此时是二楼\n", argv[1],getpid(),getppid());

    return 0;
}

然后把这两个.c文件分别编译为可执行文件:

这里我们就可以通过执行execve这个可执行程序就实现,通过这个进程调用main程序了

然后就执行 execve,结果如下:

可以看出出问题了,子进程显示的父进程pid号对不上,为什么?很简单,因为这两个进程是独立的进程,也就是说父进程已经结束了,子进程没有结束,所以子进程显示的pid对不上,会随便指向一个pid。所以需要同步处理,这里我们就简单的对父进程进行sleep一下,当然后面有更高级的做法。

        这里延时个500毫秒。

然后这里就正常了


http://www.kler.cn/a/469624.html

相关文章:

  • visual studio 自动调整代码格式的问题:
  • 【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念
  • 设计模式-结构型-适配器模式
  • [微服务]redis主从集群搭建与优化
  • 51c自动驾驶~合集45
  • Python爬虫基础——认识网页结构(各种标签的使用)
  • 青少年编程与数学 02-006 前端开发框架VUE 05课题、使用模板
  • 结合 nc 工具利用笑脸漏洞(Smile Bug)攻击 Metasploitable2 Linux
  • javadoc命令的简单使用
  • RabbitMQ通过代码创建交换机和队列
  • 分布式任务调度xxl-job入门案例
  • Chapter 1 Understanding Large Language Models
  • BUG解决:postman可以请求成功,但Python requests请求报403
  • kafka Broker专题
  • pytdx,取市场股票列表,get_security_list,start参数为8000时,数据获取失败,导致无法获取全量数据的BUG修正
  • vue3-diff算法-最长递增子序列
  • 数据结构C语言描述8(图文结合)--哈希、哈希冲突、开放地址法、链地址法等实现
  • AndroidStudio环境版本管理
  • XIAO Esp32 S3 网络摄像头——3音视频监控
  • 2.1.7-1 io_uring的使用
  • 2025年,AI时代下的前端职业思考
  • 【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管
  • 01——python (mac)安装
  • Redis两种主要的持久化方式是什么?
  • pytorch梯度上下文管理器介绍
  • 新疆乡镇界面图层arcgis格式shp数据有乡镇名称和编码2020年wgs84坐标无偏移数据内容测评