exec系統(tǒng)調(diào)用
可以理解exec就是替換了上下文,實(shí)際上沒有進(jìn)行系統(tǒng)的調(diào)用.

execve()函數(shù)是另外5個(gè)函數(shù)的基礎(chǔ).
六個(gè)函數(shù)實(shí)現(xiàn)的功能是一樣的,
區(qū)別在于使用方法,下面是用法的區(qū)別:


下面進(jìn)行分別的舉例說明:
為了方便,只摘出其中的一部分.
目的是把子函數(shù)換成ls的功能.
?再總結(jié)一下六個(gè)exec函數(shù)的特點(diǎn):
1,名字中包含l,其參數(shù)個(gè)數(shù)不定.(暫且認(rèn)為l就是long,長(zhǎng)傳入的參數(shù)長(zhǎng),是不定的.)
2,名字中包含v,其參數(shù)是用argv的數(shù)組列表傳入.
3,名字中包含p,其說明自帶有"path"路徑,所以就不需要傳入路徑了,而是直接傳入運(yùn)行的文件明file.
4,名字中包含e,其說明可以指定環(huán)境變量envp.(可以指定運(yùn)行的環(huán)境.)

//為了方便記憶,可以聯(lián)想:
可以記成viper就是vip的人兒,然后? ?
v代表v? ? i粗略代表l? ?p代表p? e代表e
要注意名字中有上面字符,都代表什么意思...

//?下面是execl,名字中有l(wèi),所以就是傳入的參數(shù)是不固定的.最后一個(gè)以NULL結(jié)尾.
//?名字中沒有p,所以要傳入路徑名.
//?按照格式去套用,第一個(gè)參數(shù)就是運(yùn)行程序的路徑. "/bin/ls"
//?第二個(gè)參數(shù)是"ls"? 第三個(gè)參數(shù)是 "-a"
//?最后沒有要傳輸?shù)牧?就直接寫NULL,表示結(jié)尾了.?
? ? execl("/bin/ls","ls","-a",NULL);
上面的第二個(gè)參數(shù)?ls和第三個(gè)參數(shù) -a,其實(shí)可以組合在一起的.
? ? execl("/bin/ls","ls -a",NULL);

下一個(gè)例子:?
?//?有v,所以說明傳入的是一個(gè)argv字符數(shù)組,而不是字符.
//?沒有p,所以要傳入,路徑名.
//?所以要先定義一個(gè)字符串的數(shù)組:? char *arg[]={"ls","-a",NULL};
? ? execv("/bin/ls",arg);

下一個(gè)例子:
//?名字中有l(wèi),說明傳入的參數(shù)是不定數(shù)目的,沒有v,所以傳入的是字符.以NULL結(jié)尾.
//?有p,說明有路徑了,只需要傳入文件名.
? ? execlp("ls","ls","-a",NULL);
??

下一個(gè)例子:
//?名字中有v,所以參數(shù)傳入的是字符串的數(shù)組.
//?有p,所以只需要傳入運(yùn)行的程序名:?ls即可.
//?char *arg[]={"ls","-a",NULL};
? ? ? execvp("ls",arg);
?

下一個(gè)例子:
//?名字中有l(wèi),說明傳入的參數(shù)是不定長(zhǎng)的.
//?名字中有e所以,可以指定運(yùn)行環(huán)境.這里沒有指令,所以用NULL
//?名字中沒有p,所以,用目錄名.
execle("/bin/ls","ls","-a",NULL,NULL);

下一個(gè)例子:
execve("/bin/ls",arg,NULL);
