呼叫shell指令碼命令:execlp("sh","sh","filename",(char*)0);
exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,
exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,
和呼叫exec函式的程序一樣。
int
exec…裝入和執行其它程式:
int
execl( char *pathname,char *arg0,char *arg1,...,char *argn,null)
int
execle( char *pathname,char *arg0,char *arg1,...,char *argn,null,char *envp)
int
execlp( char *pathname,char *arg0,char *arg1,...,null)
int
execlpe(char *pathname,char *arg0,char *arg1,...,null,char *envp)
int
execv( char *pathname,char *argv)
int
execve( char *pathname,char *argv,char *envp)
int
execvp( char *pathname,char *argv)
int
execvpe(char *pathname,char *argv,char *envp)
exec函式族裝入並執行程式pathname,並將引數
arg0(arg1,arg2,argv,envp)傳遞給子程式,出錯返回-1
在exec函式族中,字尾l、v、p、e新增到exec後,
所指定的函式將具有某種操作能力
有字尾 p時,函式可以利用dos的path變數查詢子程式檔案。
假如你希望執行命令 /bin/cat /etc/passwd /etc/group,
l時,希望接收以逗號分隔的引數列表,列表以null指標作為結束標誌
execl( "/bin/cat","/etc/passed","/etc/group",null);
v時,希望接收到乙個以null結尾的字串陣列的指標
char* argv =
execv( "/bin/cat", argv );
e時,函式傳遞指定引數envp,允許改變子程序的環境,無字尾e時,子程序使用當前程式的環境。
envp也是乙個以null結尾的字串陣列指標
execl(執行檔案)
相關函式
fork,execle,execlp,execv,execve,execvp
表頭檔案
#include
定義函式
int execl(const char * path,const char * arg,....);
函式說明
execl()用來執行引數path字串所代表的檔案路徑,接下來的引數代表執行該檔案時傳遞過去的argv(0)、argv[1]……,最後乙個引數必須用空指標(null)作結束。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno中。
範例 #include
main()
執行-rw-r--r-- 1 root root 705 sep 3 13 :52 /etc/passwd
execlp(從path 環境變數中查詢檔案並執行)
相關函式
fork,execl,execle,execv,execve,execvp
表頭檔案
#include
定義函式
int execlp(const char * file,const char * arg,……);
函式說明
execlp()會從path 環境變數所指的目錄中查詢符合引數file的檔名,找到後便執行該檔案,然後將第二個以後的引數當做該檔案的argv[0]、argv[1]……,最後乙個引數必須用空指標(null)作結束。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤**
參考execve()。
範例#include
main()
執行 -rw-r--r-- 1 root root 705 sep 3 13 :52 /etc/passwd
execv(執行檔案)
相關函式
fork,execl,execle,execlp,execve,execvp
表頭檔案
#include
定義函式
int execv (const char * path, char * const argv[ ]);
函式說明
execv()用來執行引數path字串所代表的檔案路徑,與execl()不同的地方在於execve()只需兩個引數,第二個引數利用陣列指標來傳遞給執行檔案。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤**
請參考execve()。
範例#include
main()
};execv(「/bin/ls」,argv);}執行
-rw-r--r-- 1 root root 705 sep 3 13 :52 /etc/passwd
execve(執行檔案)
相關函式
fork,execl,execle,execlp,execv,execvp
表頭檔案
#include
定義函式
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
函式說明
execve()用來執行引數filename字串所代表的檔案路徑,第二個引數系利用陣列指標來傳遞給執行檔案,
argv要傳遞給程式的完整引數列表,包括argv[0],它一般是執行程式的名字;最後乙個引數則為傳遞給執行檔案的新環境變數陣列。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤**
eacces
1. 欲執行的檔案不具有使用者可執行的許可權。
2. 欲執行的檔案所屬的檔案系統是以noexec 方式掛上。
3.欲執行的檔案或script翻譯器非一般檔案。
eperm
1.程序處於被追蹤模式,執行者並不具有root許可權,欲執行的檔案具有suid 或sgid 位。
2.欲執行的檔案所屬的檔案系統是以nosuid方式掛上,欲執行的檔案具有suid 或sgid 位元,但執行者並不具有root許可權
#include
#include
#include
int main( void )
; if ( -1 == (execve("/bin/ls", args, null)) )
puts( "shouldn't get here" );
exit( exit_success );
}[root@localhost src]# gcc execve.c
[root@localhost src]# ./a.out
a.out child_fork.c execve.c fork.c getpid.c
exec函式族的使用
exec函式族的使用 exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。下面來看下exec函式族 include int execl...
exec函式族的使用
exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。下面來看下exec函式族 include int execl const char...
exec族函式配合fork函式使用
檔案demo.c include include include include include include include intmain if pid 0 else return0 檔案changdata.c include include include include include i...