?? 11.htm
字號:
<TD><FONT face=宋體 size=2>#include<stdlib.h><BR>void my_exit(int status,void *arg)<BR>{<BR>printf(“before exit()!\n”);<BR>printf(“exit (%d)\n”,status);<BR>printf(“arg = %s\n”,(char*)arg);<BR>}<BR>main()<BR>{<BR>char * str=”test”;<BR>on_exit(my_exit,(void *)str);<BR>exit(1234);<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>exit (1234)<BR>arg = test<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc192></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>setpgid(設置進程組識別碼) </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,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>int setpgid(pid_t pid,pid_t pgid);<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>setpgid()將參數pid 指定進程所屬的組識別碼設為參數pgid 指定的組識別碼。如果參數pid 為0,則會用來設置目前進程的組識別碼,如果參數pgid為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>執行成功則返回組識別碼,如果有錯誤則返回-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>EINVAL 參數pgid小于0。<BR>EPERM 進程權限不足,無法完成調用。<BR>ESRCH 找不到符合參數pid指定的進程。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc193></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>setpgrp(設置進程組識別碼) </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,setpgid,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>int setpgrp(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>setpgrp()將目前進程所屬的組識別碼設為目前進程的進程識別碼。此函數相當于調用setpgid(0,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>執行成功則返回組識別碼,如果有錯誤則返回-1,錯誤原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc194></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>setpriority(設置程序進程執行優先權) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>getpriority,nice<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<sys/time.h><BR>#include<sys/resource.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 setpriority(int which,int who, int prio);<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>setpriority()可用來設置進程、進程組和用戶的進程執行優先權。參數which有三種數值,參數who 則依which值有不同定義<BR>which who 代表的意義<BR>PRIO_PROCESS who為進程識別碼<BR>PRIO_PGRP who 為進程的組識別碼<BR>PRIO_USER who為用戶識別碼<BR>參數prio介于-20 至20 之間。代表進程執行優先權,數值越低代表有較高的優先次序,執行會較頻繁。此優先權默認是0,而只有超級用戶(root)允許降低此值。<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>ESRCH 參數which或who 可能有錯,而找不到符合的進程<BR>EINVAL 參數which值錯誤。<BR>EPERM 權限不夠,無法完成設置<BR>EACCES 一般用戶無法降低優先權<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc195></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>system(執行shell 命令) </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,execve,waitpid,popen<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 system(const char * string);<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>system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命令執行完后隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。<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>如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值。如果system()調用成功則最后會返回執行shell命令后的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查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>在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。<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>main()<BR>{<BR>system(“ls -al /etc/passwd /etc/shadow”);<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>-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc196></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>wait(等待子進程中斷或結束) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD><FONT face=宋體 size=2>waitpid,fork<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<sys/types.h><BR>#include<sys/wait.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 wait (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>wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數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>status可以設成NULL。子進程的結束狀態值請參考waitpid()。<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),如果有錯誤發生則返回-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><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>#include<unistd.h><BR>#include<sys/types.h><BR>#include<sys/wait.h><BR>main()<BR>{<BR>pid_t pid;<BR>int status,i;<BR>if(fork()= =0){<BR>printf(“This is the child process .pid =%d\n”,getpid());<BR>exit(5);<BR>}else{<BR>sleep(1);<BR>printf(“This is the parent process ,wait for child...\n”;<BR>pid=wait(&status);<BR>i=WEXITSTATUS(status);<BR>printf(“child’s pid =%d .exit status=^d\n”,pid,i);<BR>}<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>This is the child process.pid=1501<BR>This is the parent process .wait for child...<BR>child’s pid =1501,exit status =5<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc197></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>waitpid(等待子進程中斷或結束) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -