execl(file, arg0,arg1,...) 用參數列表arg0, arg1 等等執行文件
execv(file, arglist) 除了使用參數向量列表,其他的和execl()相同
execle(file, arg0,arg1,... env) 和execl 相同,但提供了環境變量字典env
execve(file,arglist, env) 除了帶有參數向量列表,其他的和execle()相同
execlp(cmd, arg0,arg1,...) 於execl()相同,但是在用戶的搜索路徑下搜索完全的文件路徑名
execvp(cmd, arglist) 除了帶有參數向量列表,與execlp()相同
execlpe(cmd, arg0, arg1,... env) 和execlp 相同,但提供了環境變量字典env
execvpe(cmd,arglist, env) 和execvp 相同,但提供了環境變量字典env
用法:
os.execl("/usr/bin/python ", "test.py ",`'i ')這樣寫是不行的,
要這樣
os.execl("/usr/bin/python ", "python ", 'test.py ', 'i ')
os.exec*()都只是posix系統的直接映射,所以os.execl的第一個參數 "/usr/bin/python "是程序的可執行文件,而其他的都是program argument,就是c中int main(int argc,char** argv)中的argv。
而python的sys.argv應是c中argv的[1:],所以os.execl中的第二個參數 "python "對於python程序test.py不可見而且沒有用。
實際上os.execl的第二個參數也就是int main(int argc,char** argv)中的argv[0]可以是任意的,它本質上是提供給c程序作為main()函數的第一個參數使用。
比如你寫一個c程序如下。
1
2
3
4
5
6
7
8
|
int
main(
int
argc,
char
** argv)
{
int
i;
for
(i=0; i<argc; i++)
{
printf
(
"%d--%s\n"
, i, argv[i]);
}
}
|
編譯成aaa
如果你單獨執行
/path/to/aaa bbb ccc
這時會打印
0--/path/to/aaa
1--bbb
2--ccc
實際上Shell執行execl("/path/to/aaa", "/path/to/aaa", "bbb", "ccc")把argv[0]設置為/pat/to/aaa。
產生一個誤解就是認為execl中第二個參數必須是 "/path/to/aaa"的程序名,其實不然。
而用
os.execl( "/path/to/aaa", "ttt", 'bbb', 'ccc')
則打印
0--ttt
1--bbb
2--ccc