Linux-----进程处理(execve跳转)
const char *__pathL:执行程序的路径* char *const __argv[]: 对应执行程序main函数的参数* char *const __envp[]:传递的环境变量*(1):第一个参数固定是程序的名称->执行程序的路径*(2):执行程序需要传入的参数*(3):最后一个参数一定是NULLint* return 返回值* 跳转之后只有进程的信息保留了下来,其他变量的相关东西
·
目录
介绍
* 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;
}
更多推荐
所有评论(0)