linux 的exec函数,Linux 软件系列之九——exec函数族和system函数调用

1.exec函数族可以实现在一个进程中启动另一个程序的功能。系统内核会使用新的程序替换原有进程中使用的程序。开始新程序的执行。新进程和原有的进程号相同。调用exec函数后,代码段中的内容被新进程的代码替换,接着更新堆栈段和数据段。

2.exec函数族说明:

为什么一直说exec函数族呢?因为,在Linux中,并不存在exec这个函数,而是一组以exec开头的函数。

a4c26d1e5885305701be709a3d33442f.png

这6个函数的功能是相同的,我们常用的是execl和execlp两个函数。

参数说明:

1)查找方式不同

path:除了execlp和execvp之外的4个函数都要求第一个参数path必须是一个完整的要执行文件的路径。如:"/bin/ls"

file:execlp和execvp的第一个参数可以是一个要执行的文件。如:"ls",系统会到默认的环境变量"$PATH"所指 定的路径中进行查找。

参数必须以NULL表示结束。

2)参数传递方式不同

这个参数就是使用可执行文件时所需的全部命令选项字符串,包括可执行命令本身。

execl,execle,execlp中的参数传递是逐个列举的方式。

execv,execve,execvp中的参数传递是指针数组方式。

3)环境变量

使用execle,execve可以指定环境变量。

exec函数族和fork的区别:exec执行之后,进程会使用新的程序替换旧的程序并继续执行,也可以认为原有进程变成了一个新的进程执行。使用fork后,创建一个子进程,原进程继续进行,执行的程序保持不变。(详细)

4)在exec函数族中,后缀l、v、p、e添加到exec后,所指定的函数将具有某种操作能力。

有后缀 p时,函数可以利用DOS的PATH变量查找子程序文件;v时,希望接收到一个以NULL结尾的字符串数组的指针char*

argv[] = {"/bin/cat","/etc/passed","/etc/group",NULL},execv(

"/bin/cat", argv

);e时,函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。envp也是一个以NULL结尾的字符串数组指针。

假如你希望执行命令 /bin/cat

/etc/passwd /etc/group时,希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志:execl(

"/bin/cat","/etc/passed","/etc/group",NULL);

3.环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等。

env:显示系统当前所有环境变量。(environment)

4.system函数调用说明

printf函数会在碰到\n或者缓存满的时候输出到屏幕上。

system(执行shell 命令)system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程,这个是不同于exec函数的地方。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

a4c26d1e5885305701be709a3d33442f.png

传入参数:系统命令字符串。如:“ls -l”

返回值

=-1:出现错误

=0:调用成功但是没有出现子进程

>0:成功退出的子进程的id

如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。

如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为

system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

附加说明

在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

范例

#i

nclude

main()

{

system(“ls -al /etc/passwd

/etc/shadow”);

}

执行结果:

-rw-r--r-- 1 root root 705

Sep 3 13 :52 /etc/passwd

-r--------- 1 root root 572

Sep 2 15 :34 /etc/shado

5.执行system系统调用,实际上内核调用了三个系统调用:

1)调用了fork系统调用,创建一个子进程。

2)调用execve系统调用,到默认的环境变量中寻找并执行传入的参数命令。

3)执行waitpid等待返回执行结果。

6.进程的终止

进程的终止函数:exit和_exit

a4c26d1e5885305701be709a3d33442f.png

exit和_exit的区别:

_exit是直接使进程终止。不处理缓存中的内容。

exit是安全终止的函数。在退出前要查看文件打开的情况,把缓冲区的内容写回文件,这样可以更好的保护数据。

7.系统调用

在用户进程中调用内核中用于实现各种功能的内核函数的通信方式就叫系统调用。内核给我们提供API(Application

Program Interface),我们可以像调用普通函数一样实现系统调用。如:read,write都是系统调用。

a4c26d1e5885305701be709a3d33442f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值