• Linux--进程、进程替换、命令


    目录

    1.查看进程:

    2.进程替换注意事项:

    3.进程替换:

    1.execl

    2.execlp

    3.execle

    4.execv

    5.execvp

    6.execve

    4. 替换函数名理解

    5.总结替换方法


    1.查看进程

    2.进程替换注意事项:

    1.进程替换不会创建新进程,因为进程替换只是将该进程的数据替换为指定的可执行程序。而进程PCB没有改变,所以不是新的进程,进程替换后不会发生进程pid改变。

    2.进程替换后,如果替换成功后则替换函数下的代码不会执行,因为进程替换是覆盖式的替换,替换成功后进程原来的代码就消失了。同理在进程替换失败后会执行替换函数后的代码

    3.进程替换函数在进程替换成功后不返回,函数的返回值表示替换失败

    4.进程替换成功后,退出码为替换后的进程的退出码

    3.进程替换:

    “Linux--进程替换(execl、execlp、execv、execle)当我们fork()生成子进程后,子进程的代码与数据可以来自其他可执行程序。把磁盘上其他程序的数据以覆盖的形式给子进程。这样子进程就可以执行全新的程序了,这种现象称为程序替换。”

    1.execl

    注意,就是原来的程序换成了ps程序,但是PCB没有改变,但是PCB里面的有些值被修改了,比如pcb中程序的名字换成了新进程的名字;

    注意,"abc"可以, "/usr/bin/psxx"不可以;,如下:

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. printf("main pid=%d\n",getpid());
    7. execl("/usr/bin/ps","ps","-f",(char *)0);
    8. printf("execl error\n");
    9. exit(0);
    10. }

    2.execlp

    只给文件名,不需要给文件路径,可以去环境变量PATH所指的位置去搜索;

    echo $PATH

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. printf("main pid=%d\n",getpid());
    7. execlp("ps","ps","-f",(char *)0);
    8. printf("execlp error\n");
    9. exit(0);
    10. }

    3.execle

    这个execle多了一个环境变量;

    1. #include
    2. #include
    3. #include
    4. int main(int argc,char *argv[],char *envp[])
    5. {
    6. printf("main pid=%d\n",getpid());
    7. execle("/usr/bin/ps","ps","-f",(char *)0,envp);
    8. printf("execle error\n");
    9. exit(0);
    10. }

    4.execv

    execv系列把参数都放在了一个数组中,然后把这个数组传递进去即可;

    1. #include
    2. #include
    3. #include
    4. int main(int argc,char *argv[],char *envp[])
    5. {
    6. printf("main pid=%d\n",getpid());
    7. char *myargv[]={"ps","-f",0};
    8. execv("/usr/bin/ps",myargv);
    9. printf("execv error\n");
    10. exit(0);
    11. }

    5.execvp

    第一个参数只要文件名,不要路径;

    1. #include
    2. #include
    3. #include
    4. int main(int argc,char *argv[],char *envp[])
    5. {
    6. printf("main pid=%d\n",getpid());
    7. char *myargv[]={"ps","-f",0};
    8. execvp("ps",myargv);
    9. printf("execvp error\n");
    10. exit(0);
    11. }

    6.execve

    本质上,前面5个都是调用的这个系统调用execve;

    1. #include
    2. #include
    3. #include
    4. int main(int argc,char *argv[],char *envp[])
    5. {
    6. printf("main pid=%d\n",getpid());
    7. char *myargv[]={"ps","-f",0};
    8. execve("/usr/bin/ps",myargv,envp);
    9. printf("execve error\n");
    10. exit(0);
    11. }

    4. 替换函数名理解

    替换函数前面的exec不变
    l:参数采用列表
    v:参数采用数组
    p:不需要输入路径,在环境变量自动搜索
    e:要导入自己的环境变量

    所以execvp表示不需要输入路径,参数用数组传
    execve表示需要输入路径,参数用数组传,自己维护环境变量

    5.总结替换方法

    int execl ( const char* path , const char * arg ,...);
    int execlp ( const char* file , const char * arg ,...);
    int execle ( const char* path , const char * arg ,..., char* const envp []);
    int execv ( const char * path , char* const argv []);
    int execvp ( const char * file , char* const argv []);
    int execve ( const char * path , char* const argv [], char* const envp []); // 系统调用

  • 相关阅读:
    JS(JavaScript)详解
    myBatis基础学习笔记
    每日五道java面试题之spring篇(九)
    DL Homework 4
    Scanf 不安全报错问题
    我在 Java 中错过了什么,一个 Kotlin 开发人员的观点
    FreeRTOS学习day1
    动画设计岗位怎么运用智能程序分析数据更清晰
    是时候和 Confluence 说再见了
    Three.js 绘制动态模型
  • 原文地址:https://blog.csdn.net/m0_59052131/article/details/127642009