目录

 介绍

结合fock()案例


 介绍

  * 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()跳转接口。execve.c文件:

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

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

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

    //执行跳转
    /**
     * 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 返回值
     * 跳转之后只有进程的信息保留了下来,其他变量的相关东西都删除了
     * **/
    char* args[] = { "/home/hwj/C++/system/execve_1/build/main" ,s,NULL };
    char* envs[] = { NULL };
    int re = execve(args[0],args,envs);
    if (re == -1) {
        printf("跳转失败\n");
        return 1;
    }
    printf("fuck\n");
    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;
}

结合fock()案例

main.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/son" ,son,NULL };
        char* envs[] = { NULL };
        int re = execve(args[0], args, envs);
        if (re == -1) {
            printf("跳转失败\n");
            return 1;
        }
        printf("fuck\n");
    }
    else {
        usleep(500*1000);
        printf("我是父进程,pid为:%d,我的子进程pid:%d\n", getpid(), pid);
    }
    return 0;
}

son.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;
}

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐