|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,该子进程被新的程序替换,改变地址空间,进程映像和一些属性,但是pid号不变。
8 p, l4 A- O+ Xexecve(): m- a! g" ?" f R0 E" m' {" Q0 F
#include
" c# p/ @4 c' x; E7 fint execve(const char *filename, char *const argv[], char *const envp[]);: I! i8 `8 Y: M" D
参数含义:+ u `4 c0 `0 k* O! b8 S$ e
filename:路径名,表示载入进程空间的新程序路径。+ C# F4 h# c1 k6 Y( w* Z/ i
argv[]:命令行参数,argv[0]为命令名。
7 g! i) j. T! k Z+ I& zenvp[]:新程序的环境变量。) e1 a( d0 j; k/ V# U- X; |, C6 J
返回值:成功时不会返回,使用时不用检查返回值,可通过errno检查。
1 ^0 l+ i' Q" {2 P6 ^$ j以下函数都是根据execve实现:
! C; ]6 z% f/ V1 @int execl(const char *path, const char arg, …/ (char *) NULL */);& t( s5 ?8 t; O2 x, P2 B
int execlp(const char *file, const char arg, …/ (char *) NULL */);
+ [3 X* m6 Y$ G5 kint execle(const char *path, const char arg, …/, (char *) NULL, char * const envp[] */);; O* J& c% d/ d
int execv(const char *path, char *const argv[]);
4 P% p1 m# b& U7 e9 eint execvp(const char *file, char *const argv[]);; P) X" U- L+ @3 P# O% j
int execvpe(const char *file, char *const argv[],char *const envp[]);
, \! A! w P Z. `实验代码:
# x0 z' }% m+ } x" \ t. ?$ K创建子进程,子进程使用execl调用ls查看当前目录下的文件。. A1 }7 Z4 N! z9 u; ]
exec.c:3 Y4 s/ T9 d) E0 q0 N* m
使用execl调用shell命令查看文件信息。
5 n( N& b1 u* R! ^- P* B: G3 a1 j# Q![]()
+ f( B0 ?) z2 B; p/ A: o/ F: P![]()
! B6 r# l7 v0 S, k3 Q执行结果:- w9 a$ \: ?, D
![]()
/ K$ a3 Q x- ^' x) g* v# CLinux系统基于这些函数实现了“popen”,“system”等函数,这些函数能够直接调用shell等函数。% L/ W, U" k2 V: O& P4 d. _6 T
![]()
- a/ y4 {' b; ?; @0 ? |
|