exec... 系列函數
L 系列:
int execl ( char *path, char *arg0, char *arg1, ... , NULL);
int execlp ( char *path, char *arg0, char *arg1, ..., NULL);
int execle ( char *path, char *arg0, char *arg1, ..., NULL, char **envp
);
int execlpe ( char *path, char *arg0, char *arg1, ..., NULL, char **envp
);
V 系列:
int execv ( char *path, char *arg[] );
int execvp ( char *path, char *arg[] );
int execve ( char *path, char *arg[]
, char **envp
);
int execvpe ( char *path, char *arg[]
, char **envp
);
說明: 原型在 process.h
exec...系列函數可以載入並運行稱為子進程的其它檔案。調用成功時,子進程將覆蓋父進程。
必須有足夠的記憶體。
*
path 是被調用子進程檔案名稱。
exec...函數通過標準的 DOS 搜尋演算法來尋找
path:
1. 如果木有副檔名或者句點:先尋找該名;如果沒有找到,就加上.com,.exe副檔名再找
2. 如果給定副檔名, 直接尋找給定 的檔案
3. 如果給出句點, 則尋找沒有副檔名的檔案
4. 如果path沒有包含確定的目錄, 含有 p 尾碼的
exec...函數 首先在目前的目錄下尋找,
如果找不到,就 再尋找DOS環境變數PATH所指定的目錄
#include<process.h>
#include<stdio.h>
#include<errno.h>
void main(int argc, char * argv[])
{
int i;
printf("Command line arguments:/n");
for(i = 0; i < argc; i++)
printf("[%2d] : %s/n", i, argv[i])
;
printf(" About to exec child with arg1 arg2 ... /n");
execvp("h://output//ten2bin.exe"
, argv);
perror("execv error");
exit(1);
}
#include<process.h>
#include<stdio.h>
#include<errno.h>
void main(int argc, char * argv[])
{
int i;
printf("Command line arguments:/n");
for(i = 0; i < argc; i++)
printf("[%2d] : %s/n", i, argv[i]
);
printf(" About to exec child with arg1 arg2 ... /n");
execvp("ten2bin.exe"
, argv);
perror("execv error");
exit(1);
}
加在 exec...系列函數後的尾碼 L, V, P, E 表示命名函數的某種操作能力;
L:
表明指標參數 arg0, arg1, ... 作為獨立參數進行傳遞。通常, L 尾碼用於事Crowdsourced Security Testing道待傳遞參數個數的情況
V:
表明紮針參數 arg0], arg[1], ..., arg[n] 作為指標數組進行傳遞。通常, V 尾碼用於待傳遞參數個數可變的情況
P:
表明如果沒有指定目錄,則首先在目前的目錄下尋找檔案,沒有找到時再到環境變數PATH 指定的路徑尋找
E:
表明參數envp可以傳到子進程,用以改變子進程的環境。在沒有e尾碼的情況下,子進程將繼承父進程的環境
exec...
系列函數必須至少傳遞一個 參數(arg0 或 arg[0])給子進程,該參數約定為 path 的一個拷貝。類似於 main(int argc,
char * argv[])中的 argv[0], argn / arg[n] 後的 NULL 表示參數表結束。
執行成功時,傳回值為子進程的退出狀態(0為正常終結)。如果子進程 調用 了非0參數的exit函數,退出狀態則為非0值。
出現錯誤時,exec...函數傳回值 -1, 並將全域變數errno設定為下列之一。
E2BIG 參數表太長
EACCES 無此許可權
EMFILE 開啟的檔案太多
ENOENT 路徑或者檔案名稱沒有找到
ENOEXEC 運行格式錯誤
ENOMEM 無足夠記憶體
可移植性: 僅適用於DOS