【并发程序设计】4. exec函数族

4.exec函数族

exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数

exec函数族主要用于在当前进程内部执行一个新的程序,而不会创建新的进程。

  • 子进程调用exec函数,族父进程不受影响。
  • 进程当前内容被指定的程序替换,但进程号不变

exec函数族中的一些主要成员:

  1. execl:这是exec函数族中最简单的一个,它接受一个可执行文件路径和一个参数列表,列表以NULL结尾。这个函数将新程序的参数一一对应地传递给新程序。
  2. execv:与execl类似,但是参数是通过一个指针数组传递的,而不是直接列出。
  3. execlpexecvp:这两个函数会搜索PATH环境变量来找到可执行文件,而不需要提供完整的路径名。

execl 函数

  1. 原型

    #include <unistd.h>
    int execl(const char *path, const char *arg, ...);
    
  2. 功能execl函数用来执行一个文件,并将控制权转交给这个新程序。当调用成功时,原有进程的内容(代码段、数据段和堆栈等)将被新程序的内容取代,execl函数不会返回。

  3. 参数

    • path:要执行的程序的路径。
    • arg:传递给新程序的参数列表,最后一个参数需要是NULL,以标识参数列表的结束。
  4. 返回值

    • 如果调用成功,execl函数不会返回。
    • 如果调用失败(例如找不到指定的文件或没有足够的内存等),则返回-1,并设置errno来指示错误类型。
  5. execl函数后面的字母“l”代表的是“list”,意味着该函数通过参数列表的方式来传递参数

  6. 示例:

    使用execl函数来执行ls命令

    #include <stdio.h>
    #include <unistd.h>
    int main(int argc, const char *argv[])
    {
    	if(execl("/bin/ls","ls","-a","-l","./",NULL)<0)
    	{
    		perror("execl");
    	}
    	return 0;
    }
    

    编译运行a.out 和 shell命令$ls -a -l 做对比

    在这里插入图片描述

    运行效果一致

execlp 函数

  1. 原型

    #include <unistd.h>
    int execlp(const char *file, const char *arg, ...);
    
  2. 功能execlp函数用于在当前进程中执行指定的可执行文件,并用该新程序替换当前进程的映像。

  3. 参数

    • file:要执行的程序的文件名(或路径),不需要带扩展名,因为系统会自动根据文件名查找可执行文件。
    • arg:传递给新程序的参数列表,最后一个参数需要是NULL,以标识参数列表的结束。
    • ...:可选参数,可以传递多个,每个参数都会按顺序传递给新程序。
  4. 返回值

    • 如果调用成功,execlp函数不会返回。
    • 如果调用失败,则返回-1,并设置errno来指示错误类型。

execv 函数

  1. 原型

    #include <unistd.h>
    int execv(const char *path, char *const argv[]);
    
  2. 功能execv函数用来执行一个文件,并将控制权转交给这个新程序。与execl相似,当调用成功时,原有进程的内容(代码段、数据段和堆栈等)将被新程序的内容取代,execv函数不会返回。

  3. 参数

    • path:要执行的程序的路径。
    • argv:传递给新程序的参数数组,其中argv[0]通常是被执行文件的路径,数组的最后一个元素应该是NULL,以标识参数列表的结束。
  4. 返回值

    • 如果调用成功,函数不会返回。
    • 如果调用失败,则返回-1,并设置errno来指示错误类型。

execvp 函数

  1. 原型

    #include <unistd.h>
    int execvp(const char *file, char *const argv[]);
    
  2. 功能execvp函数用于在当前进程中执行指定的可执行文件,并用该新程序替换当前进程的映像。

  3. 参数

    • file:要执行的程序的文件名(或路径),不需要带扩展名,因为系统会自动根据文件名查找可执行文件。
    • argv:传递给新程序的参数数组,其中argv[0]通常是被执行文件的路径,数组的最后一个元素应该是NULL,以标识参数列表的结束。
  4. 返回值

    • 如果调用成功,execvp函数不会返回。
    • 如果调用失败,则返回-1,并设置errno来指示错误类型。
  5. 示例

    使用execvexecvp函数来执行ls命令

    #include <stdio.h>
    #include <unistd.h>
    int main(int argc, const char *argv[])
    {
    char *arg[] = {“ls”,-a”,-l”,/etc”, NULL};
    if  (execv(/bin/ls”, arg) < 0) {
    perror(“execv”);
    }  
    if  (execvp(“ls”, arg) < 0) {
    perror(“execvp”);
    }  
    	return 0;
    }
    

    运行效果同上

system 函数

  1. 原型

    #include <stdlib.h>
    int system(const char *command);
    
  2. 功能system函数用于在当前进程中创建一个子进程,并在子进程中执行一个shell命令。该函数会等待命令执行完成后返回。

  3. 参数

    • command:指向以空字符终止的字符串的指针,该字符串包含要在子进程中执行的命令。
  4. 返回值:如果system函数成功执行了指定的命令,它将返回命令的退出状态。如果发生错误或命令无法执行,则返回-1。通常,返回值是shell的退出代码,可以通过WEXITSTATUS(status)宏来获取。

  5. 注意system函数的使用可能会带来安全风险,因为它允许执行任意的shell命令。因此,在安全性要求较高的环境中,应该避免使用system函数,或者至少对输入的命令进行严格的检查和限制。

  6. 示例

    #include <studio.h>
    #include <stdlib.h>
    int main()
    {
        system("ls -a -l ./");
    }
    
  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值