?? 11.htm
字號:
參數filename字符串所包含的目錄路徑無法存取,權限不足<BR>ELOOP 過多的符號連接<BR>ETXTBUSY 欲執(zhí)行的文件已被其他進程打開而且正把數據寫入該文件中<BR>EIO I/O 存取錯誤<BR>ENFILE 已達到系統(tǒng)所允許的打開文件總數。<BR>EMFILE 已達到系統(tǒng)所允許單一進程所能打開的文件總數。<BR>EINVAL 欲執(zhí)行文件的ELF執(zhí)行格式不只一個PT_INTERP節(jié)區(qū)<BR>EISDIR ELF翻譯器為一目錄<BR>ELIBBAD ELF翻譯器有問題。<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>char * argv[ ]={“l(fā)s”,”-al”,”/etc/passwd”,(char *)0};<BR>char * envp[ ]={“PATH=/bin”,0}<BR>execve(“/bin/ls”,argv,envp);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執(zhí)行 </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=linuxc181></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>execvp(執(zhí)行文件) </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,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>#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 execvp(const char *file ,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>execvp()會從PATH 環(huán)境變量所指的目錄中查找符合參數file 的文件名,找到后便執(zhí)行該文件,然后將第二個參數argv傳給該欲執(zhí)行的文件。<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>如果執(zhí)行成功則函數不會返回,執(zhí)行失敗則直接返回-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>/*請與execlp()范例對照*/<BR>#include<unistd.h><BR>main()<BR>{<BR>char * argv[ ] ={ “l(fā)s”,”-al”,”/etc/passwd”,0};<BR>execvp(“l(fā)s”,argv);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執(zhí)行 </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=linuxc182></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>exit(正常結束進程) </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,atexit,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>void exit(int status);<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>exit()用來正常終結目前進程的執(zhí)行,并把參數status返回給父進程,而進程所有的緩沖區(qū)數據會自動寫回并關閉未關閉的文件。<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><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>參考wait()<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc183></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>exit(結束進程執(zhí)行) </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,wait,abort<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>void _exit(int status);<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>_exit()用來立刻結束目前進程的執(zhí)行,并把參數status返回給父進程,并關閉未關閉的文件。此函數調用后不會返回,并且會傳遞SIGCHLD信號給父進程,父進程可以由wait函數取得子進程結束狀態(tài)。<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><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>_exit()不會處理標準I/O 緩沖區(qū),如要更新緩沖區(qū)請使用exit()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc184></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>vfork(建立一個新的進程) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>wait,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>#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>pid_t vfork(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>vfork()會產生一個新的子進程,其子進程會復制父進程的數據與堆棧空間,并繼承父進程的用戶代碼,組代碼,環(huán)境變量、已打開的文件代碼、工作目錄和資源限制等。Linux 使用copy-on-write(COW)技術,只有當其中一進程試圖修改欲復制的空間時才會做真正的復制動作,由于這些繼承的信息是復制而來,并非指相同的內存空間,因此子進程對這些變量的修改和父進程并不會同步。此外,子進程不會繼承父進程的文件鎖定和未處理的信號。注意,Linux不保證子進程會比父進程先執(zhí)行或晚執(zhí)行,因此編寫程序時要留意<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>死鎖或競爭條件的發(fā)生。 </FONT></DIV></TD> <TD><FONT face=宋體 size=2><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>如果vfork()成功則在父進程會返回新建立的子進程代碼(PID),而在新建立的子進程中則返回0。如果vfork 失敗則直接返回-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>EAGAIN 內存不足。ENOMEM 內存不足,無法配置核心所需的數據結構空間。<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>if(vfork() = =0)<BR>{<BR>printf(“This is the child process\n”);<BR>}else{<BR>printf(“This is the parent process\n”);<BR>}<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執(zhí)行 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>this is the parent process<BR>this is the child process<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc185></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>getpgid(取得進程組識別碼) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>setpgid,setpgrp,getpgrp<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>pid_t getpgid( pid_t pid);<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>getpgid()用來取得參數pid 指定進程所屬的組識別碼。如果參數pid為0,則會取得目前進程的組識別碼。<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>執(zhí)行成功則返回組識別碼,如果有錯誤則返回-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>ESRCH 找不到符合參數pid 指定的進程。<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>/*取得init 進程(pid=1)的組識別碼*/<BR>#include<unistd.h><BR>mian()<BR>{<BR>printf(“init gid = %d\n”,getpgid(1));<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執(zhí)行 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>init gid = 0<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -