|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,该子进程被新的程序替换,改变地址空间,进程映像和一些属性,但是pid号不变。
- E& v! P6 ]2 x4 ?& Q7 Mexecve():+ {% l& y; M4 [+ j2 }
#include
" o5 R7 B& C3 P! w! {& C# [int execve(const char *filename, char *const argv[], char *const envp[]);' [9 A3 i6 N) F4 Y1 G, H
参数含义:! l+ W+ o( \1 T( @% r5 _
filename:路径名,表示载入进程空间的新程序路径。: ~8 h7 |' W) W: i1 j5 u' R. A; Q
argv[]:命令行参数,argv[0]为命令名。
' T9 V5 ^! N0 ]" Y) zenvp[]:新程序的环境变量。) h: E% w" s& {! N/ W
返回值:成功时不会返回,使用时不用检查返回值,可通过errno检查。
6 U0 @+ K7 i- F% H& G l' D以下函数都是根据execve实现:5 `) j7 w$ ~! w& o
int execl(const char *path, const char arg, …/ (char *) NULL */);+ K( J" m5 L# E. p9 b1 z# e6 `
int execlp(const char *file, const char arg, …/ (char *) NULL */);1 N, Y% B3 s- H" d6 i0 N, s
int execle(const char *path, const char arg, …/, (char *) NULL, char * const envp[] */);
1 D, ?6 x* g5 O h/ Kint execv(const char *path, char *const argv[]);
4 K9 D; Z* ] |& [( W5 E8 d* Dint execvp(const char *file, char *const argv[]);
7 S( C* n$ X \% `7 aint execvpe(const char *file, char *const argv[],char *const envp[]);1 G7 O4 d6 y. h7 ~7 k& N: i# @
实验代码:* U5 F8 r& ~; B- j3 ]
创建子进程,子进程使用execl调用ls查看当前目录下的文件。$ t: M' f: m+ x
exec.c:
8 {5 n2 U6 Y! `. B* G8 L使用execl调用shell命令查看文件信息。: A- z( O M( E% p. h, W& y' J
; x. M3 H3 E- i6 d
8 A: P7 b4 }" x7 ]' g
执行结果:
p/ o2 ^* R. L0 `$ _![]()
( c4 W( \ m7 c) j! E3 `( ^Linux系统基于这些函数实现了“popen”,“system”等函数,这些函数能够直接调用shell等函数。+ E4 c/ C8 s7 M: S* L' H
![]()
" U2 p- _% @$ |: X1 C5 L4 t; [+ } |
|