[原创] Helper2416-28——Linux_Programing——System()调用 & exec()函数族

yuanlai2010   2014-8-6 12:23 楼主
System()调用 & exec()函数族
参与Helper2416开发板助学计划心得
我们需要在当前的程序中调用其他程序该怎么办?比如在程序中使用系统命令!
1:system()系统调用
  1. /* 2014 - 08 -06
  2. * yuanlai2010
  3. * system调用测试
  4. */
  5. #include <stdio.h>
  6. int main()
  7. {
  8. printf("Hello 0001 !\n");
  9. system("echo "Hello 0002 !"");
  10. printf("Hello 0003 !\n");
  11. return 0;
  12. }
运行结果
  1. [Linux@CentOS system]$ gcc system.c -o system
  2. [Linux@CentOS system]$ ./system
  3. Hello 0001 !
  4. Hello 0002 !
  5. Hello 0003 !
  6. [Linux@CentOS system]$
System系统调用是通过解析字符串来决定到底调用哪个程序的,这里会有很多隐含的问题,都是基于字符串解析出现的问题。System调用虽然很方便,但还是少用为好!
2:exec()函数替换当前进程(进程就是在存储器中运行的程序)
先看下面的例子:
  1. /* 2014 - 08 -06
  2. * yuanlai2010
  3. * exec函数测试
  4. */
  5. #include <unistd.h> //要使用exec函数就得包含此头文件
  6. #include <stdio.h>
  7. int main()
  8. {
  9. printf("Hello 0001 !\n");
  10. execl("/bin/echo", "echo", "hello 0002 !", NULL);
  11. printf("Hello 0003 !\n");
  12. return 0;
  13. }
运行结果
  1. [Linux@CentOS 000_execl]$ gcc execl.c -o execl
  2. [Linux@CentOS 000_execl]$ ./execl
  3. Hello 0001 !
  4. hello 0002 !
  5. [Linux@CentOS 000_execl]$
很显然,在execlp函数之后的程序就没有被运行了,这是因为在执行exec函数后整个进程都被替换echo(前提是exec函数执行成功)!同时也可以发现exec函数能够很精确的调用其他的程序!
exec()函数族
exec函数主要可以分为两组:列表函数和数组函数:
列表函数:execl()、execlp()、execle()
列表函数以参数列表的形式接收命令行参数:
程序:
第一个参数告诉exec函数将运行什么程序。对execl()或execle()来说,他是程序的完整路径名;对于execlp()来讲就是命令的名字,execlp()会根据它在PATH变量中查找程序、
命令行参数:
你需要一次列出想使用的命令行参数。别忘了,第一个参数命令行参数必须是程序名,也就是说列表板exec()的强两个参数是相同的字符串.。
NULL
需要在最后一个命令行参数后加上NULL,告诉后面没有参数了
环境变量:
如果调用了以…..e()结尾的exec()函数,还可以传递环境变量数组。
  1. execl("/bin/echo", "/bin/echo", "hello world", NULL);
  2. execlp("echo", "echo", "hello world", NULL);
  3. execle("/bin/echo", "/bin/echo", "hello world", NULL, env_vars); //env_vars是一个字符串数组,里面放了环境变量
数组函数:execv()、execvp()、execve()
相比与列表函数,这里主要是把命令行参数保存在字符串数组中。
  1. char *my_args[]={"/bin/echo", "hello world", NULL};
  2. execv("/bin/echo", my_args);
  3. char *my_args[]={"echo", "hello world", NULL};
  4. execvp("echo", my_args);
如果exec调用出错了怎么办?
如果exec在调用程序的时候发生错误,则当前程序会继续运行,exec函数会返回一个值-1;同时会把错误信息记录在errno变量中,errno变量是定义在errno.h中的全局变量,和它定义在一起的还有很多标准错误码。例如:
EPERM=1 不允许操作
ENOENT=2 没有该文件或目录
ESRCH=3 没有该进程
这样就可以拿errno和这些值比较,也可以用string.h中的strerror()的函数查询标准错误消息:
puts(strerror(errno)): strerror()将错误吗转换为一条消息
当系统找不到想要运行的程序时就会把errno变量设置为ENOENT,以上代码就会显示这条消息:没有该文件或目录
失败黄金法则:
1:尽可能的收拾残局
2:把errno变量设置为错误码
3:返回-1
最后附上exec()函数族助记图
exec.png
论坛ID:yuanlai2010
发表时间:2014-08-06
本帖最后由 yuanlai2010 于 2014-8-6 12:26 编辑

回复评论 (2)

很给力,贴子排版也非常漂亮!我现在主要用system做程序调用。当然,不同的应用会有不同的需求!
My dreams will go on... http://www.jyxtec.com
点赞  2014-8-6 12:27
引用: spacexplorer 发表于 2014-8-6 12:27
很给力,我现在主要用system做程序调用。当然,不同的应用会有不同的需求!

主要是怕system调用字符串解析的时候容易出错,尤其是在system参数由用户输入的时候
点赞  2014-8-6 12:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复