_exec,_wexec 函式
在這一系列中的每個函式會載入並執行新的處理程序:
結尾的函式名稱的字母決定變化。
_exec 函式後置字元 |
描述 |
---|---|
e |
envp陣列的指標環境設定,會傳遞至新的處理程序。 |
l |
命令列引數傳遞至個別_exec函式。 通常用來事先知道新的處理序的參數數目。 |
p |
PATH環境變數用來找出要執行的檔案。 |
v |
argv陣列的命令列引數的指標,會傳遞至_exec。 通常用來以新的處理序的參數數目是變數。 |
備註
每個_exec函式會載入並執行新的處理程序。 所有_exec函式會使用相同的作業系統函式 (CreateProcess)。 _exec函式會自動處理多位元組字元字串引數視需要辨識多位元組字元順序,根據目前使用中的多位元組字碼頁。 _wexec函式是寬字元版本的_exec函式。 _wexec函式的行為相同,其_exec家族的對應項目不同之處在於它們不一定要處理多位元組字元字串。
泛用文字常式對應
Tchar.h 常式 |
_Unicode 之後,未定義的 _MBCS |
定義的 _MBCS |
定義 _unicode 之後 |
---|---|---|---|
_texecl |
_execl |
_execl |
_wexecl |
_texecle |
_execle |
_execle |
_wexecle |
_texeclp |
_execlp |
_execlp |
_wexeclp |
_texeclpe |
_execlpe |
_execlpe |
_wexeclpe |
_texecv |
_execv |
_execv |
_wexecv |
_texecve |
_execve |
_execve |
_wexecve |
_texecvp |
_execvp |
_execvp |
_wexecvp |
_texecvpe |
_execvpe |
_execvpe |
_wexecvpe |
cmdname參數會指定要當做新的處理序執行的檔案。 它可以指定完整的路徑 (由根開始)、 (從目前的工作目錄),部份的路徑或檔名。 如果cmdname並沒有副檔名或並不會結束以句點 (.)、 _exec函式命名的檔案搜尋。 如果搜尋不成功,它會嘗試相同的主檔名,副檔名.com 檔案,然後使用.exe、.bat 和.cmd 副檔名。 如果cmdname副檔名,該擴充功能用在搜尋]。 如果cmdname有句號, _exec函式會搜尋cmdname ,不含檔案名稱副檔名。 _execlp_execlpe, _execvp,以及_execvpe搜尋cmdname (使用相同的程序) 中所指定的目錄PATH環境變數。 如果cmdname (亦即,如果它是相對路徑) 包含磁碟機代碼或任何斜線、 _exec呼叫僅會搜尋指定的檔案類型。 無法搜尋路徑。
提供一或多個指標為字元字串,做為參數中的參數傳遞至新的處理程序_exec呼叫。 這些字元的字串會形成新的處理序的參數清單。 繼承的環境設定,而且形成新的處理序的參數清單的字串的長度不能超過 32 kb。 結束的 null 字元 ('\ 0') 每個字串不包含在計數中,但是 (隔開這些參數的自動插入) 的空白字元都會被計算。
注意事項 |
---|
在字串中內嵌的空格,可能會造成未預期的行為。 比方說,傳遞_exec字串"hi there"取得兩個引數,新的處理序,將會導致"hi"和"there"。如果目的是讓新的處理程序開啟檔案,名為 「 大家好那里",程序都會失敗。您可以避免這種所括住的字串: "\"hi there\""。 |
安全性提示 |
---|
不要傳送使用者的輸入_exec而不會明確地檢查其內容。_exec將會導致呼叫 CreateProcess ,請記住該不合格的路徑名稱可能會導致潛在的安全性弱點。 |
_exec函式會驗證它們的參數。 如果預期的參數都是空值的指標,空字串,或省略, _exec中所述的不正確的參數處理常式叫用的函式參數驗證。 如果執行,則允許繼續執行,這些函式會設定errno到EINVAL ,並傳回-1。 沒有新的處理程序會執行。
可以做為不同的參數傳遞的引數的指標 (在_execl, _execle, _execlp,以及_execlpe) 或做為陣列的指標 (在_execv, _execve, _execvp,和_execvpe)。 至少一個參數, arg0,必須傳遞給新的處理序。 這個參數是argv[0] 的 [新的處理程序。 這個參數通常是一份cmdname。 (不同的值不會產生錯誤)。
_execl, _execle, _execlp,以及_execlpe電話通常用來事先知道參數的數目。 參數arg0變數的指標,通常是cmdname。 參數arg1到argn移向 [建立新的參數清單的程序的字元字串。 必須接在 null 指標argn來標示參數清單的結尾。
_execv, _execve, _execvp,以及_execvpe呼叫是很有用的時機參數,以新的處理序的數字是變數。 指標參數傳像陣列一樣, argv。 參數argv[0] 變數的指標,通常是cmdname。 參數argv[1] 透過argvn 按一下 [建立新的參數清單的程序的字元字串。 參數argvn+ 1] 必須是NULL指標來標示參數清單的結尾。
檔案開啟時_exec呼叫後仍保持開啟新的處理序中。 在_execl, _execlp, _execv,以及_execvp呼叫,新的處理序會繼承呼叫程序的環境。 _execle_execlpe, _execve,以及_execvpe呼叫傳送一份環境設定,透過改變新的處理程序環境envp參數。 envp(除了的最後一個項目中) 其中的每個項目指向的 null 結尾字串的字元指標陣列定義環境變數。 這樣的字串通常會有表單NAME=value , NAME是環境變數的名稱和value已設定該變數的字串值。 (請注意, value沒有括在雙引號。) 最後一個項目envp陣列應該NULL。 當envp本身是NULL,新的處理序會繼承呼叫程序的環境設定。
程式執行的其中一種_exec函式永遠載入記憶體好像程式的.exe 檔案的標頭中的最大的分派] 欄位設為 0xFFFFH 的預設值。
_exec的呼叫不會保留轉譯的模式開啟的檔案。 如果新的處理序必須使用從呼叫的處理序繼承而來的檔案,請使用 _setmode 常式,以設定為 [您想要的模式的轉譯模式,這些檔案。 您必須明確地排清 (使用fflush或_flushall) 或關閉之前的任何資料流_exec函式呼叫。 訊號設定不會保留在新的處理序的呼叫所建立的_exec常式。 訊號設定會重設為預設值,在新的處理程序。
範例
// crt_args.c
// Illustrates the following variables used for accessing
// command-line arguments and environment variables:
// argc argv envp
// This program will be executed by crt_exec which follows.
#include <stdio.h>
int main( int argc, // Number of strings in array argv
char *argv[], // Array of command-line argument strings
char **envp ) // Array of environment variable strings
{
int count;
// Display each command-line argument.
printf( "\nCommand-line arguments:\n" );
for( count = 0; count < argc; count++ )
printf( " argv[%d] %s\n", count, argv[count] );
// Display each environment variable.
printf( "\nEnvironment variables:\n" );
while( *envp != NULL )
printf( " %s\n", *(envp++) );
return;
}
執行下列的程式,執行 Crt_args.exe:
// crt_exec.c
// Illustrates the different versions of exec, including
// _execl _execle _execlp _execlpe
// _execv _execve _execvp _execvpe
//
// Although CRT_EXEC.C can exec any program, you can verify how
// different versions handle arguments and environment by
// compiling and specifying the sample program CRT_ARGS.C. See
// "_spawn, _wspawn Functions" for examples of the similar spawn
// functions.
#include <stdio.h>
#include <conio.h>
#include <process.h>
char *my_env[] = // Environment for exec?e
{
"THIS=environment will be",
"PASSED=to new process by",
"the EXEC=functions",
NULL
};
int main( int ac, char* av[] )
{
char *args[4];
int ch;
if( ac != 3 ){
fprintf( stderr, "Usage: %s <program> <number (1-8)>\n", av[0] );
return;
}
// Arguments for _execv?
args[0] = av[1];
args[1] = "exec??";
args[2] = "two";
args[3] = NULL;
switch( atoi( av[2] ) )
{
case 1:
_execl( av[1], av[1], "_execl", "two", NULL );
break;
case 2:
_execle( av[1], av[1], "_execle", "two", NULL, my_env );
break;
case 3:
_execlp( av[1], av[1], "_execlp", "two", NULL );
break;
case 4:
_execlpe( av[1], av[1], "_execlpe", "two", NULL, my_env );
break;
case 5:
_execv( av[1], args );
break;
case 6:
_execve( av[1], args, my_env );
break;
case 7:
_execvp( av[1], args );
break;
case 8:
_execvpe( av[1], args, my_env );
break;
default:
break;
}
// This point is reached only if exec fails.
printf( "\nProcess was not execed." );
exit( 0 );
}
.NET Framework 的對等用法
標頭: process.h