Linux 常用C函數(進程操作篇2)

Linux 常用C函數(進程操作篇2)
2007-03-22 11:31


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()。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章