?? 11.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- saved from url=(0056)http://linux.tcpip.com.cn/~foolox/c_fun/function/11.html --><HTML><HEAD><TITLE>Untitled Document</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"><META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD><BODY><TABLE width="100%"> <TBODY> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc176></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋體 size=2><BR>atexit(設置程序正常結束前調用的函數) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>_exit,exit,on_exit<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>#include<stdlib.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>int atexit (void (*function)(void));<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>atexit()用來設置一個程序正常結束前調用的函數。當程序通過調用exit()或從main中返回時,參數function所指定的函數會先被調用,然后才真正由exit()結束程序。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>如果執行成功則返回0,否則返回-1,失敗原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>#include<stdlib.h><BR>void my_exit(void)<BR>{<BR>printf(“before exit () !\n”);<BR>}<BR>main()<BR>{<BR>atexit (my_exit);<BR>exit(0);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>before exit()!<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc177></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋體 size=2><BR>execl(執行文件) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>fork,execle,execlp,execv,execve,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>int execl(const char * path,const char * arg,....);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>execl()用來執行參數path字符串所代表的文件路徑,接下來的參數代表執行該文件時傳遞過去的argv(0)、argv[1]……,最后一個參數必須用空指針(NULL)作結束。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>#include<unistd.h><BR>main()<BR>{<BR>execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>/*執行/bin/ls -al /etc/passwd */<BR>-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc178></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋體 size=2><BR>execlp(從PATH 環境變量中查找文件并執行) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>fork,execl,execle,execv,execve,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>int execlp(const char * file,const char * arg,……);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到后便執行該文件,然后將第二個以后的參數當做該文件的argv[0]、argv[1]……,最后一個參數必須用空指針(NULL)作結束。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存于errno 中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>參考execve()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>/* 執行ls -al /etc/passwd execlp()會依PATH 變量中的/bin找到/bin/ls */<BR>#include<unistd.h><BR>main()<BR>{<BR>execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc179></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋體 size=2><BR>execv(執行文件) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>fork,execl,execle,execlp,execve,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>int execv (const char * path, char * const argv[ ]);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>execv()用來執行參數path字符串所代表的文件路徑,與execl()不同的地方在于execve()只需兩個參數,第二個參數利用數組指針來傳遞給執行文件。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存于errno 中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>請參考execve()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>/* 執行/bin/ls -al /etc/passwd */<BR>#include<unistd.h><BR>main()<BR>{<BR>char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};<BR>execv(“/bin/ls”,argv);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc180></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋體 size=2><BR>execve(執行文件) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>fork,execl,execle,execlp,execv,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>int execve(const char * filename,char * const argv[ ],char * const envp[ ]);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>execve()用來執行參數filename字符串所代表的文件路徑,第二個參數系利用數組指針來傳遞給執行文件,最后一個參數則為傳遞給執行文件的新環境變量數組。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存于errno 中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>EACCES<BR>1. 欲執行的文件不具有用戶可執行的權限。<BR>2. 欲執行的文件所屬的文件系統是以noexec 方式掛上。<BR>3.欲執行的文件或script翻譯器非一般文件。<BR>EPERM<BR>1.進程處于被追蹤模式,執行者并不具有root權限,欲執行的文件具有SUID 或SGID 位。<BR>2.欲執行的文件所屬的文件系統是以nosuid方式掛上,欲執行的文件具有SUID 或SGID 位元,但執行者并不具有root權限。<BR>E2BIG 參數數組過大<BR>ENOEXEC 無法判斷欲執行文件的執行文件格式,有可能是格式錯誤或無法在此平臺執行。<BR>EFAULT 參數filename所指的字符串地址超出可存取空間范圍。<BR>ENAMETOOLONG 參數filename所指的字符串太長。<BR>ENOENT 參數filename字符串所指定的文件不存在。<BR>ENOMEM 核心內存不足<BR>ENOTDIR 參數filename字符串所包含的目錄路徑并非有效目錄<BR>EACCES
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -