linux进程替换(简介)

一:什么是进程替换?

定义:

进程替换,是指用一个新进程来替换此时正执行的进程。新进程从头开始执行自己的代码。

例子:

我们有一个父进程A,在父进程A中有一个子进程B

一般来说,子进程是执行父进程的程序代码

但我们这个时候将一个新的程序赋给子进程B,这个时候父进程A和子进程B就相当于两个独立的程序,各自运行了

 简单来说:就是让父进程中的某个子进程独立运行其他程序

二:如何进行进程替换?

我们使用六个进程替换的系统调用,他们分别是

execl,execlp,execle,execv,execvp,execvpe

 我们经过观察发现int exec都是相同的,不同的只是后面几个字母

 为了方便大家理解,我们从最基础的两个使用开始

execl:

execl("绝对路径","使用方法",NULL);

举例:

execl("/usr/bin/ls", "ls", "-a", "-l", "-i", NULL);

execv:

execv("绝对路径","指针数组")(备注:指针数组需要自己定义)

举例:

 char* const argv[NUM] = {
     (char*)"ls", 
     (char*)"-a", 
     (char*)"-i", 
     (char*)"-l", 
      NULL};
    execv("/usr/bin/ls", argv);

有些小伙伴就要说了:替换一个程序还要打根目录,烦不烦啊!

所以这个时候,我们的P兄弟就出来了

他们就是execlp和execvp

他们不需要打根目录,进程根据此进程名自动去环境变量中遍历查找该进程的路径,直接能在当前目录生成

execlp("ls", "ls", "-a", "-l", "-i", NULL);



char* const argv[NUM] = {
     (char*)"ls", 
     (char*)"-a", 
     (char*)"-i", 
     (char*)"-l", 
      NULL};
    execvp("ls", argv);

最后也就是execle和execlvpe,就是我们可以使用自己写的程序,通过环境变量来进行替换

execle:

execle("绝对或相对路径",“进程名字”,“方法”,NULL,“环境变量”)

char* const env[NUM] = {
      (char*)"MY_ENV=2001",
      (char*)"YOU_ENV=2002",
      NULL
    };
    //这里路径可以是绝对路径,也可以是相对路径
    execle("./myproc", "myproc", "-b", NULL, env);

execlvpe:

execlvpe(“进程路径”,“名字+方法+NULL的指针数组”,“存放环境变量的指针数组”)

char* const envp[NUM] = {
      (char*)"MY_ENV=2001",
      (char*)"YOU_ENV=2002",
      NULL
    };
    //argv
    char* const argv[NUM] = {
      (char*)"myproc",
      (char*)"-a",
      NULL
    };
    //execvpe("myproc", argv, envp);
    execvpe("myproc", argv, envp);

猜你喜欢

转载自blog.csdn.net/qq_62718027/article/details/128398187