【Linux基础】函数族

. exec函数族说明
fork()函数是用于创建一个子进程,该子进程几乎拷贝了父进程的全部内容。那在新进程中如何运行新的程序呢?exec函数簇提供了一个在进程中启动另一个程序执行的方法。
exec函数簇可以根据指定的文件名或目录找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。
2. exec函数族语法
在linux中并没有exec函数,而是有6个exec开头的函数族,它们之音语法有细微差别,本书在下面会详细讲解。

01.jpg (54.54 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-6 10:51 上传

下表6.4再对这几个函数中函数名和对应语法做一总结,主要指出了函数名中每一位所表明的含义,希望读者结合此表加以记忆。

02.jpg (30.95 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-6 10:52 上传

3. exec函数族实例
1 execlp
用execlp函数作实例,说明如何使用文件名的方式来查找可执行文件,同时使用参数列表的方式。
/*execlp.c*/
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t result;
result=fork();
if(result==0)
{
if(execlp("ls","ls","-l",NULL)<0)
{
perror("execlp error");
}
}
}
在该程序中,首先使用创建一个子进程,然后在程序里使用execlp函数。这里execlp使用文件名的方式进行查找,系统会在默认的环境变量PATH中寻找该可执行文件,参数列表是在shell中使用的命令和选项。参数列表最后一项应为NULL.运行程序后,运行结果为列出当前目录下所有文件,不同的目录下有不同的结果。例如:
[root@localhost exec]# ./execlp
总计 12
-rwxr-xr-x 1 root root 4954 07-05 09:48 execlp
-rw-r—r-- 1 root root 207 07-05 09:48 execlp.c
2 用execl函数作实例,说明如何使用完整的文件目录来查找对应的可执行文件(注意目录必须以“/”开头,否则将其视为文件名),同时使用参数列表的方式。
/*execl.c*/
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t result;
result=fork();
if(result==0)
{
if(execl("/bin/ls","ls","-l",NULL)<0)
{
perror("execlp error");
}
}
}
编译后,运行所得结果和运行exelp函数的例子一样。
3 execv
参数传递为构造指针数组方式。
/*execv.c*/
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t result;
char *arg[]={"ls","-l",NULL};
result=fork();
if(result==0)
{
if(execv("/bin/ls",arg)<0)
{
perror("execlp error");
}
}
}
运行结果为列出当前目录下的所有文件。
4 execve
e为设置环境变量。
/*execv.c*/
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t result;
char *arg[]={“env”,NULL};
char *envp[]={“PATH=/tmp”,”USER=lzg”,NULL};
result = fork();
if(result==0)
{
if(execve(“/bin/env”,arg,envp)<0)
{
Perror(“execlp error”);
}
}
}
编译运行得到结果为
[root@localhost exec]# ./execve
PATH=/tmp
USER=lzg
(4) 使用exec函数族应注意的地方
在使用exec函数族时,一定要加上错误判断语句。因为exec很容易执行失败,其中最常见的原因有:
找不到文件或路径,此时errno被设置为ENOENT;
数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT;
没有对应可执行文件的运行权限,此时errno被设置为EACCES。
小知识:事实上,这6个函数中真正的系统调用只有execve(),其他5个都是库函数,它们最终都会调用execve()这个系统调用。
补充知识:system函数
(1)system函数说明
system函数是一个与操作系统紧密相关的函数。用户可以使用它在自己的程序中调用系统提供的各种命令。因此,使用system函数比使用exec函数族更方便。
(2)system函数说明

03.jpg (26.46 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-6 10:53 上传

(3)system函数实例
/*system.c*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
int result;
result=system("ls -l");
return 0;
}
运行结果是列出当前目录下的所有文件。在不同的目录下运行程序会有不同的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值