• Linux--bash、fork、exec、进程替换相关命令


    目录

    1.bash:

    2.fork+exec()例1:

    3.fork+exec()例子2:


    1.bash:

    linux bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令;Bash还能从文件中读取命令,这样的文件称为脚本;和其他Unix shell一样,它支持文件名替换、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。

    bash的命令语法是Bourne shell命令语法的超集。

    bash实质上是一个可执行程序,一个用户的工作环境。
    bash的功能一是可以记入历史命令,第二呢,可以用tab键自动补全。第三。alias命令别名,第四呢,工作控制,可以将某些任务放到后台去运行。再一个是程序脚本就是可以执行shell脚本文件。还有通配符以及内建命令type。

    2.fork+exec()例1:

    利用bash创建ps命令

    利用bash创建ps命令----execl的使用(结合fork)

    fork+exec()是Linux上创建新进程方式;

    //(1)main.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. printf("main pid=%d,ppid=%d\n",getpid(),getppid());
    9. pid_t pid=fork();
    10. assert(pid!=-1);
    11. if(pid==0)
    12. {
    13. printf("chilr pid=%d,ppid=%d\n",getpid(),getppid());
    14. execl("/usr/bin/ps","ps","-f",NULL);
    15. printf("excel error");
    16. exit(0);
    17. }
    18. wait(NULL);
    19. exit(0);
    20. }

     

     

    3.fork+exec()例子2:

    当前主程序复制产生一个子进程,子进程用新程序(b)替换自身;

    //(2)main2.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. int main(int argc,char *argv[],char *envp[])
    8. {
    9. printf("main pid=%d\n",getpid());
    10. pid_t pid=fork();
    11. assert(pid!=-1);
    12. if(pid==0)
    13. {
    14. char *myargv[]={"b","hello","abc","123",(char *)0};
    15. execve("./b",myargv,envp);
    16. perror("execl error");
    17. exit(0);
    18. }
    19. wait(NULL);
    20. printf("main over\n");
    21. exit(0);
    22. }

    (3)

    //b.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main(int argc,char *argv[],char *envp[])
    6. {
    7. printf("b pid=%d\n",getpid());
    8. int i=0;
    9. printf("argc=%d\n",argc);
    10. for(;i
    11. {
    12. printf("argv[%d]=%s\n",i,argv[i]);
    13. }
    14. for(i=0;envp[i]!=NULL;i++)
    15. {
    16. printf("envp[%d]=%s\n",i,envp[i]);
    17. }
    18. exit(0);
    19. }

     

    ./main2

  • 相关阅读:
    全国双非院校考研信息汇总整理 Part.1
    面试理论篇二
    ctfshow—溯源—新手上路
    Annealing-based Label-Transfer Learning for Open World Object Detection(论文解析)
    对企业数字化转型有哪些建议?
    聊聊设计模式--简单工厂模式
    51单片机学习:红外遥控实验
    AWS的虚拟化技术
    【软件测试】requests 库请求体字符串解码
    【JAVA UI】【HarmonyOS】 鸿蒙setBindStateChangedListener的基本使用
  • 原文地址:https://blog.csdn.net/m0_59052131/article/details/127649046