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毫秒。
然后这里就正常了