|
nice(改變進程優先順序) |
相關函數
|
setpriority,getpriority
|
表頭文件
|
#include<unistd.h>
|
定義函數
|
int nice(int inc);
|
函數說明
|
nice()用來改變進程的進程執行優先順序。參數inc數值越大則優先順序排在越後面,即表示進程執行會越慢。只有超級用戶才能使用負的inc 值,代表優先順序排在前面,進程執行會較快。
|
返回值
|
如果執行成功則返回0,否則返回-1,失敗原因存於errno中。
|
錯誤代碼
|
EPERM 一般用戶企圖轉用負的參數inc值改變進程優先順序。
|
|
|
on_exit(設置程序正常結束前調用的函數) |
相關函數
|
_exit,atexit,exit
|
表頭文件
|
#include<stdlib.h>
|
定義函數
|
int on_exit(void (* function)(int, void*),void *arg);
|
函數說明
|
on_exit()用來設置一個程序正常結束前調用的函數。當程序通過調用exit()或從main中返回時,參數function所指定的函數會先被調用,然後才真正由exit()結束程序。參數arg指針會傳給參數function函數,詳細情況請見範例。
|
返回值
|
如果執行成功則返回0,否則返回-1,失敗原因存於errno中。
|
附加說明
|
|
範例
|
#include<stdlib.h> void my_exit(int status,void *arg) { printf(“before exit()!/n”); printf(“exit (%d)/n”,status); printf(“arg = %s/n”,(char*)arg); } main() { char * str=”test”; on_exit(my_exit,(void *)str); exit(1234); }
|
執行
|
before exit()! exit (1234) arg = test
|
|
|
setpgid(設置進程組識別碼) |
相關函數
|
getpgid,setpgrp,getpgrp
|
表頭文件
|
#include<unistd.h>
|
定義函數
|
int setpgid(pid_t pid,pid_t pgid);
|
函數說明
|
setpgid()將參數pid 指定進程所屬的組識別碼設爲參數pgid 指定的組識別碼。如果參數pid 爲0,則會用來設置目前進程的組識別碼,如果參數pgid爲0,則會以目前進程的進程識別碼來取代。
|
返回值
|
執行成功則返回組識別碼,如果有錯誤則返回-1,錯誤原因存於errno中。
|
錯誤代碼
|
EINVAL 參數pgid小於0。 EPERM 進程權限不足,無法完成調用。 ESRCH 找不到符合參數pid指定的進程。
|
|
|
setpgrp(設置進程組識別碼) |
相關函數
|
getpgid,setpgid,getpgrp
|
表頭文件
|
#include<unistd.h>
|
定義函數
|
int setpgrp(void);
|
函數說明
|
setpgrp()將目前進程所屬的組識別碼設爲目前進程的進程識別碼。此函數相當於調用setpgid(0,0)。
|
返回值
|
執行成功則返回組識別碼,如果有錯誤則返回-1,錯誤原因存於errno中。
|
|
|
setpriority(設置程序進程執行優先權) |
相關函數
|
getpriority,nice
|
表頭文件
|
#include<sys/time.h> #include<sys/resource.h>
|
定義函數
|
int setpriority(int which,int who, int prio);
|
函數說明
|
setpriority()可用來設置進程、進程組和用戶的進程執行優先權。參數which有三種數值,參數who 則依which值有不同定義 which who 代表的意義 PRIO_PROCESS who爲進程識別碼 PRIO_PGRP who 爲進程的組識別碼 PRIO_USER who爲用戶識別碼 參數prio介於-20 至20 之間。代表進程執行優先權,數值越低代表有較高的優先次序,執行會較頻繁。此優先權默認是0,而只有超級用戶(root)允許降低此值。
|
返回值
|
執行成功則返回0,如果有錯誤發生返回值則爲-1,錯誤原因存於errno。 ESRCH 參數which或who 可能有錯,而找不到符合的進程 EINVAL 參數which值錯誤。 EPERM 權限不夠,無法完成設置 EACCES 一般用戶無法降低優先權
|
|
|
system(執行shell 命令) |
相關函數
|
fork,execve,waitpid,popen
|
表頭文件
|
#include<stdlib.h>
|
定義函數
|
int system(const char * string);
|
函數說明
|
system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命令執行完後隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
|
返回值
|
如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string爲空指針(NULL),則返回非零值。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能爲system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
|
附加說明
|
在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。
|
範例
|
#include<stdlib.h> main() { system(“ls -al /etc/passwd /etc/shadow”); }
|
執行
|
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd -r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow
|
|
|
wait(等待子進程中斷或結束) |
相關函數
|
waitpid,fork
|
表頭文件
|
#include<sys/types.h> #include<sys/wait.h>
|
定義函數
|
pid_t wait (int * status);
|
函數說明
|
wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則
|
參數
|
status可以設成NULL。子進程的結束狀態值請參考waitpid()。
|
返回值
|
如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存於errno中。
|
附加說明
|
|
範例
|
#include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> main() { pid_t pid; int status,i; if(fork()= =0){ printf(“This is the child process .pid =%d/n”,getpid()); exit(5); }else{ sleep(1); printf(“This is the parent process ,wait for child.../n”; pid=wait(&status); i=WEXITSTATUS(status); printf(“child’s pid =%d .exit status=^d/n”,pid,i); } }
|
執行
|
This is the child process.pid=1501 This is the parent process .wait for child... child’s pid =1501,exit status =5
|
|
|
waitpid(等待子進程中斷或結束) |
相關函數
|
wait,fork
|
表頭文件
|
#include<sys/types.h> #include<sys/wait.h>
|
定義函數
|
pid_t waitpid(pid_t pid,int * status,int options);
|
函數說明
|
waitpid()會暫時停止目前進程的執行,直到有信號來到或子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則參數status可以設成NULL。參數pid爲欲等待的子進程識別碼,其他數值意義如下: pid<-1 等待進程組識別碼爲pid絕對值的任何子進程。 pid=-1 等待任何子進程,相當於wait()。 pid=0 等待進程組識別碼與目前進程相同的任何子進程。 pid>0 等待任何子進程識別碼爲pid的子進程。 參數option可以爲0 或下面的OR 組合 WNOHANG 如果沒有任何已經結束的子進程則馬上返回,不予以等待。 WUNTRACED 如果子進程進入暫停執行情況則馬上返回,但結束狀態不予以理會。 子進程的結束狀態返回後存於status,底下有幾個宏可判別結束情況 WIFEXITED(status)如果子進程正常結束則爲非0值。 WEXITSTATUS(status)取得子進程exit()返回的結束代碼,一般會先用WIFEXITED 來判斷是否正常結束才能使用此宏。 WIFSIGNALED(status)如果子進程是因爲信號而結束則此宏值爲真 WTERMSIG(status)取得子進程因信號而中止的信號代碼,一般會先用WIFSIGNALED 來判斷後才使用此宏。 WIFSTOPPED(status)如果子進程處於暫停執行情況則此宏值爲真。一般只有使用WUNTRACED 時纔會有此情況。 WSTOPSIG(status)取得引發子進程暫停的信號代碼,一般會先用WIFSTOPPED 來判斷後才使用此宏。
|
返回值
|
如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存於errno中。
|
範例
|
參考wait()。
|