exec函数

2 篇文章 0 订阅
1 篇文章 0 订阅

exec()函数
笔记来自《嗨翻C语言》进程与系统调用 第9章

exec()函数的头文件是#include<unistd.h>

调用system函数时,操作系统必须解释命令字符串,然后决定运行哪些程序和怎样运行,问题就出在操作系统需要解释字符串上,比较容易出错。

从而exec()函数可以解决这个问题。

进程是存储器中运行的程序,在linux查看进程,输入ps -ef命令,操作系统使用进程标识符PID来标识进程。

exec()函数通过运行其他程序来替换当前进程,可以告诉exec()函数要使用哪些命令行参数和环境变量,新程序启动后PID和老程序一样,就像两个程序接力跑,把进程交接给了新程序。

exec函数有很多

  1. 列表函数 :execl()、execlp()、execle()
    列表函数以参数列表的形式接受命令行参数
    1程序
    告诉exec()函数将运行什么程序,对execl()或execle()来说,它是程序的完整路径名;对execlp()来讲就是命令的名字,execlp()会根据它来查找程序。
    2命令行参数
    需要依次列出想使用的命令行参数。第一个命令行参数必须是程序名,也就是说列表版exec()的前两个参数是相同的字符串。
    3NULL
    需要在最后一个命令行参数后加上NULL,告诉函数没有其他参数了
    4环境变量(如果有的话)
    如果调用了以e结尾的exec()函数,还可以传递环境变量数组,像POWER=4、SPPED=17、PORT=OPEN…那样的字符串数组。
    举个栗子:
    execl("/home/flynn/clu","/home/flynn/clu",“paranoids”,“contract”,NULL)
    execlp(“clu”,“clu”,“paranoids”,“contract”,NULL)
    execle("/home/flynn/clu","/home/flynn/clu",“paranoids”,“contract”,NULL,env_vars)
    注:env_vars是一个字符串数组,里面放了环境变量
  2. 数组函数:execv()、execvp()、execve()
    如果已经把命令行参数保存在了数组里,就会发现这两个版本用起来更容易:
    execv=参数数组/参数向量
    execv("/home/flynn/clu",my_args);
    execvp=参数数组/参数向量+在PATH中查找
    execvp(“clu”,my_args)
    注:参数需要保存在字符串数组my_args中
    两者唯一的区别是execvp会在PATH中查找程序
    如何记住exec函数
    exec后面可以跟一到两个字符,但只能是l、v、p和e中的一个,代表你想使用的功能,如下表所示:
    |使用 | 字符 |
    |参数列表 | l |
    | 参数数组/向量 | v |
    |根据PATH查找 | p |
    |环境变量 | e |
    出错了怎么办
    就算调用的程序发生错误,当前进程会继续运行。这点很有用,就算第二个进程启动失败,还是能够从错误中恢复出来,并向用户报告错误消息。

注意:
只要让exec()函数执行成功,就会修改进程。它会运行新程序替代你的程序,也就是,只要exec()函数一运行,你的程序就会停止运行。
系统调用是操作系统中的函数,当进行系统调用时,相当于调用程序外的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值