• lv5 嵌入式开发-2 exec函数族


    目录

    1 进程 – exec函数族

    1.1 exec函数族特点 

    1.2 进程 – execl / execlp使用方法

    1.3 进程 – execv / execvp

    2 进程 – system

    3 exec族要点演示


    掌握:exec函数族、system

    1 进程 – exec函数族

    执行程序,通孔ps -elf发现,父进程是bash。这意味着该进程是由一个 bash shell 中启动的。

    1.1 exec函数族特点 

    • 进程调用exec函数族执行某个程序
    • 进程当前内容被指定的程序替换(重要特点)
    • 实现让父子进程执行不同的程序(fork父子进程执行的是一个程序,下面是操作方法即原理)

           -父进程创建子进程

           -子进程调用exec函数族

           -父进程不受影响

    1.2 进程 – execl / execlp使用方法

    1. #include
    2. int execl(const char *path, const char *arg, …);
    3. int execlp(const char *file, const char *arg, …); //区别是不需要完整路径
    • 成功时执行指定的程序;失败时返回EOF
    •  path   执行的程序名称,包含路径  
    • arg…  传递给执行的程序的参数列表  
    • file   执行的程序的名称,在PATH中查找(需要环境变量中添加

    示例1:

    执行ls命令,显示/etc目录下所有文件的详细信息

    1. if(execl(“/bin/ls”, “ls”, “-a”, “-l”, “/etc”, NULL) < 0){
    2. perror(“execl”);
    3. }
    4. if(execlp(“ls”, “ls”, “-a”, “-l”, “/etc”, NULL) < 0){
    5. perror(“execlp”);
    6. }

    0号参数即使命令本身,后面再加其他参数

    最后参数必须加NULL空指针

    1. #include
    2. #include
    3. int main(){
    4. printf("before exec\n");
    5. if(execlp("ls","ls","-a","-l","./",NULL)<0){
    6. perror("execl");
    7. }
    8. }

    1.3 进程 – execv / execvp

    1. #include
    2. int execv(const char *path, char *const argv[]);
    3. int execvp(const char *file, char *const argv[]);

    成功时执行指定的程序;失败时返回EOF  

    arg… 封装成指针数组的形式

    示例:

    执行ls命令,显示/etc目录下所有文件的详细信息   

    1. char  *arg[] = {“ls”, “-a”, “-l”, “/etc”, NULL};  
    2.  
    3. if(execv(“/bin/ls”, arg) < 0)
    4. {      
    5. perror(“execv”);  
    6. }      
    7. if(execvp(“ls”, arg) < 0)
    8. {      
    9. perror(“execvp”);  
    10. }  
    1. #include <stdio.h>
    2. #include <unistd.h>
    3. int main(){
    4. char *agv[] = {"ls","-a","-l","./",NULL};
    5. if(execv("/bin/ls",agv)<0){
    6. perror("execv");
    7. }
    8. }
    9. linux@linux:~/Desktop$ ./a.out
    10. total 24
    11. drwxr-xr-x 2 linux linux 4096 Sep 18 10:32 .
    12. drwxr-xr-x 22 linux linux 4096 Sep 18 10:32 ..
    13. -rwxrwxr-x 1 linux linux 7330 Sep 18 10:32 a.out
    14. -rw-rw-r-- 1 linux linux 184 Sep 16 11:24 fork.c
    15. -rw-rw-r-- 1 linux linux 157 Sep 18 10:32 test.c
    16. linux@linux:~/Desktop$ ls -a -l ./
    17. total 24
    18. drwxr-xr-x 2 linux linux 4096 Sep 18 10:32 .
    19. drwxr-xr-x 22 linux linux 4096 Sep 18 10:32 ..
    20. -rwxrwxr-x 1 linux linux 7330 Sep 18 10:32 a.out
    21. -rw-rw-r-- 1 linux linux 184 Sep 16 11:24 fork.c
    22. -rw-rw-r-- 1 linux linux 157 Sep 18 10:32 test.c
    23. linux@linux:~/Desktop$

    2 进程 – system

    1. #include
    2. int system(const char *command);

    成功时返回命令command的返回值;失败时返回EOF  

    当前进程等待command执行结束后才继续执行

    其原理也是fork的子进程,执行完不会被替代

    示例;

    1. #include
    2. #include
    3. int main(){
    4. system("ls -a -l ./");
    5. }

    3 exec族要点演示

    示例

    1. //a.out
    2. #include
    3. int main(int argc,char **argv){
    4. printf("hello world %s,%s\n",argv[1],argv[2]);
    5. }
    6. #include
    7. #include
    8. //test
    9. #include
    10. #include
    11. int main(){
    12. printf("before exec\n");
    13. if(execlp("./a.out","./a.out","abc","def",NULL)<0){
    14. perror("execv");
    15. }
    16. printf("after exec\n");
    17. }

    printf没有执行,因为a.out把程序全部替换了。

    如果想不被替换?

    可以写一个子程序,使用exec

    1. #include
    2. #include
    3. int main(){
    4. pid_t pid;
    5. printf("before exec\n");
    6. pid = fork();
    7. if(pid==0){
    8. if(execl("/bin/ls","-a","-l","./",NULL)<0){
    9. perror("execl");
    10. }
    11. }
    12. printf("after execl\n");
    13. }

    printf被打印出来了。 

  • 相关阅读:
    云服务器重启后无法获取IP地址怎么办?
    今年十八,喜欢SQL注入
    计算机视觉+人工智能面试笔试总结——ONNX模型
    cx3588 Rockchip_基于 DRM 框架的 HDMI 开发指南
    关于 Laravel Redis 多个进程同时取队列问题详解
    bean的生命周期
    太阳能发电与蓄电池研究(Matlab代码实现)
    kubernetes集群编排——etcd
    好奇喵 | Tor浏览器——如何拥有一颗洋葱并使用
    LAMP 综合实验
  • 原文地址:https://blog.csdn.net/m0_60718520/article/details/132998794