对比C语言中execv相关的执行文件的三个函数

 更新时间:2015年08月31日 10:10:40   投稿:goldensun  
这篇文章主要介绍了对比C语言中execv相关的执行文件的三个函数,分别为execv()函数和execve()函数以及execvp()函数,需要的朋友可以参考下

C语言execv()函数:执行文件函数
头文件:

 #include <unistd.h>

定义函数:

int execv (const char * path, char * const argv[]);

函数说明:execv()用来执行参数path 字符串所代表的文件路径, 与execl()不同的地方在于execve()只需两个参数, 第二个参数利用数组指针来传递给执行文件.

返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.

错误代码:请参考 execve ().

范例

/* 执行/bin/ls -al /etc/passwd */
#include <unistd.h>
main()
{
  char * argv[] = {"ls", "-al", "/etc/passwd", (char*)};
  execv("/bin/ls", argv);
}

执行:

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

C语言execve()函数:执行文件函数
头文件:

 #include <unistd.h>

定义函数:

int execve(const char * filename, char * const argv[], char * const envp[]);

函数说明:execve()用来执行参数filename 字符串所代表的文件路径, 第二个参数系利用数组指针来传递给执行文件, 最后一个参数则为传递给执行文件的新环境变量数组.

返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.

错误代码:

EACCES:
1. 欲执行的文件不具有用户可执行的权限.
2. 欲执行的文件所属的文件系统是以noexec 方式挂上.
3. 欲执行的文件或script 翻译器非一般文件.

EPERM:
1. 进程处于被追送模式, 执行者并不具备root 权限, 欲执行的文件具有SUID 或SGID 位.
2. 欲执行的文件所属的文件系统是以nosuid 方式挂上, 欲执行的文件具有SUID 或SGID 位元, 但执行者并不具有root 权限.

E2BIG 参数数组过大

ENOEXEC 无法判断欲执行文件的执行文件格式, 有可能是格式错误或无法在此平台执行.

EFAULT 参数filename 所指的字符串地址超出可存取空间范围.

ENAMETOOLONG 参数filename 所指的字符串太长.

ENOENT 参数filename 字符串所指定的文件不存在.

ENOMEM 核心内存不足

ENOTDIR 参数filename 字符串所包含的目录路径并非有效目录

EACCES 参数filename 字符串所包含的目录路径无法存取, 权限不足.

ELOOP 过多的符号连接

ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中

EIO I/O 存取错误

ENFILE 已达到系统所允许的打开文件总数.

EMFILE 已达到系统所允许单一进程所能打开的文件总数.

EINVAL 欲执行文件的ELF 执行格式不只一个PT_INTERP 节区

EISDIR ELF 翻译器为一目录

ELIBBAD ELF 翻译器有问题.

范例

#include <unistd.h>
main()
{
  char * argv[] = {"ls", "-al", "/etc/passwd", (char *)0};
  char * envp[] = {"PATH=/bin", 0};
  execve("/bin/ls", argv, envp);
}

执行:

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

C语言execvp()函数:执行文件函数
头文件:

 #include <unistd.h>

定义函数:

int execvp(const char *file, char * const argv []);

函数说明:execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名, 找到后便执行该文件, 然后将第二个参数argv 传给该欲执行的文件。

返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.

错误代码:请参考 execve ()。

范例

/*请与execlp ()范例对照 */
#include <unistd.h>
main()
{
  char * argv[] = {"ls", "-al", "/etc/passwd", 0};
  execvp("ls", argv);
}

执行:
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

相关文章

  • C语言实现基于最大堆和最小堆的堆排序算法示例

    C语言实现基于最大堆和最小堆的堆排序算法示例

    这篇文章主要介绍了C语言实现基于最大堆和最小堆的堆排序算法示例,分别是基于最大堆的升序排序和基于最小堆的降序排序实例,需要的朋友可以参考下
    2016-06-06
  • C语言中二维数组作为函数参数来传递的三种方法

    C语言中二维数组作为函数参数来传递的三种方法

    这篇文章主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 如何实现循环队列

    如何实现循环队列

    本文主要介绍了C语言循环队列的实现,对于数据结构与算法的研究有所帮助,需要的朋友可以参考下
    2015-07-07
  • strncpy与snprintf 的用法比较

    strncpy与snprintf 的用法比较

    以下是对strncpy与snprintf的具体用法以及区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • 史上最贴心的 VS code C++ 环境配置超详细教程

    史上最贴心的 VS code C++ 环境配置超详细教程

    这篇文章主要介绍了史上最贴心的 VS code C++ 环境配置超详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • C语言中二维数组指针的简要说明

    C语言中二维数组指针的简要说明

    这篇文章主要介绍了C语言中二维数组指针的简要说明,文章后也附送一个小练习题进行巩固,需要的朋友可以参考下
    2015-08-08
  • C++实现扫雷、排雷小游戏

    C++实现扫雷、排雷小游戏

    这篇文章主要为大家详细介绍了C++实现扫雷、排雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++实现LeetCode(98.验证二叉搜索树)

    C++实现LeetCode(98.验证二叉搜索树)

    这篇文章主要介绍了C++实现LeetCode(98.验证二叉搜索树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 基于Windows API分解路径问题的详解

    基于Windows API分解路径问题的详解

    本篇文章是对Windows API分解路径进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现K-Means算法

    C语言实现K-Means算法

    这篇文章主要为大家详细介绍了C语言实现K-Means算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论