|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,该子进程被新的程序替换,改变地址空间,进程映像和一些属性,但是pid号不变。
$ S. P& m* q: I. v5 e; b8 o2 M6 Qexecve():/ Y- K- {2 Y+ `- _/ [
#include+ n" _& ~3 ^& ^$ O9 a8 c7 @
int execve(const char *filename, char *const argv[], char *const envp[]);, c" s# R7 p; K) k( z; y
参数含义:( e" m0 q2 Q9 B$ d* ?
filename:路径名,表示载入进程空间的新程序路径。5 V# g2 i* S& X4 j6 P
argv[]:命令行参数,argv[0]为命令名。
$ o+ c# ~+ O6 Senvp[]:新程序的环境变量。! E6 M9 M0 X N" N
返回值:成功时不会返回,使用时不用检查返回值,可通过errno检查。
* K" Z6 W5 O- l) Z以下函数都是根据execve实现:
7 Q1 x9 t3 E s" Tint execl(const char *path, const char arg, …/ (char *) NULL */);7 t8 ^8 z) b: ^; R/ u
int execlp(const char *file, const char arg, …/ (char *) NULL */);
, o+ t# ^# i- rint execle(const char *path, const char arg, …/, (char *) NULL, char * const envp[] */);
- p3 v) t6 s9 X8 y- l4 B v, eint execv(const char *path, char *const argv[]);9 w0 C6 i3 m4 s/ J
int execvp(const char *file, char *const argv[]);6 h8 J/ }1 t9 x/ [7 m2 c* p
int execvpe(const char *file, char *const argv[],char *const envp[]);+ Q) |6 |5 C- a, m7 Q! }* z
实验代码:
% i$ I+ m$ c7 P7 c创建子进程,子进程使用execl调用ls查看当前目录下的文件。" t2 R1 @; Z9 E& i0 o- Q8 k
exec.c:. s3 f, D$ V6 P' X
使用execl调用shell命令查看文件信息。
' W8 c) _ M3 |4 x" S: C4 L![]()
. R/ t7 J1 k6 Z1 Y![]()
) y+ S% Z0 S, L, j执行结果:
7 q6 u* L9 n% `9 A![]()
% G6 `4 F2 j' O" t# cLinux系统基于这些函数实现了“popen”,“system”等函数,这些函数能够直接调用shell等函数。! S: U2 g7 U. j! j
![]()
: }* q* X) ]5 z x5 k$ L |
|