|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,该子进程被新的程序替换,改变地址空间,进程映像和一些属性,但是pid号不变。$ A0 y1 _% x5 X6 E1 n: J f1 x+ z
execve():- w# ^5 \2 w g6 |* O/ e, S
#include8 B9 {# K4 ] L# {3 c
int execve(const char *filename, char *const argv[], char *const envp[]);
% M! L5 t5 z' d2 |# N参数含义:8 C. L* M* B( K& e
filename:路径名,表示载入进程空间的新程序路径。) O% p8 w1 J/ Y( _) ~# h6 ]
argv[]:命令行参数,argv[0]为命令名。
1 c) S. z1 Z. g9 ]/ T& f# O: Nenvp[]:新程序的环境变量。
C% I( b0 h7 V+ j O返回值:成功时不会返回,使用时不用检查返回值,可通过errno检查。3 l1 o+ Q1 v N9 C# v6 W
以下函数都是根据execve实现:# [ M8 `, V" ~4 P
int execl(const char *path, const char arg, …/ (char *) NULL */);
A8 G- a2 G, h; o yint execlp(const char *file, const char arg, …/ (char *) NULL */);
7 m. k; _1 ^% E6 U( Uint execle(const char *path, const char arg, …/, (char *) NULL, char * const envp[] */);* [/ \: d6 ~ c% n- H+ ?- @+ v- Z
int execv(const char *path, char *const argv[]);
n2 m+ g ^# D5 _; }* Tint execvp(const char *file, char *const argv[]); W! \/ o1 M% |9 S
int execvpe(const char *file, char *const argv[],char *const envp[]);
7 d8 m+ z! q$ K6 ^' V8 Y! S5 }! z实验代码:
7 x. e4 \7 ~) J0 _; k2 }7 q; E创建子进程,子进程使用execl调用ls查看当前目录下的文件。
* m; t: N4 t# r- _5 Q& x+ pexec.c:9 M/ o: I- B; C' b4 F1 O& {" g7 R
使用execl调用shell命令查看文件信息。6 F3 t- Q7 d4 [6 b9 R6 V
# ~ u% Q$ _* }' F. l
. G, o2 J5 |3 X
执行结果:# Z* f8 s7 K C2 F! ^- y3 V
2 |: Q. }( v7 p. T: y& a! D! ]9 \
Linux系统基于这些函数实现了“popen”,“system”等函数,这些函数能够直接调用shell等函数。
% q: u( h Y. ^8 u 6 Y+ ~' l0 q( m/ ]" w/ X
|
|