?? 多進程編程的相關知識總結(一).txt
字號:
#include
pid_t waitpid(pid,stat_loc,options)
pid_t pid;
int *stat_loc,options;
說明:當pid等于-1,options等于0時,該系統調用等同于wait().否則該
系統調用的行為由參數pid和options決定.
pid指定了一組父進程要求知道其狀態的子進程:
-1:要求知道任何一個子進程的返回狀態.
>0:要求知道進程號為pid值的子進程的狀態.
<-1:要求知道進程組號為pid的絕對值的子進程的狀態.
options參數為以比特方式表示的標志以或運算組成的位圖,每個
標志以字節中某個比特置1表示:
WUNTRACED:報告任何未知而又已停止運行的指定進程號的子進
程的狀態.該子進程的狀態自停止運行時起就沒有被報告
過.
WCONTINUED:報告任何繼續運行的指定進程號的子進程的狀態,
該子進程的狀態自繼續運行起就沒有被報告過.
WHOHANG:若調用本系統調用時,指定進程號的子進程的狀態目
前并不是立即有效的(即可被立即讀取的),調用進程并被
暫停執行.
WNOWAIT:保持將其狀態設置在stat_loc的進程在可等待狀態.
該進程將等待直到下次被要求其返回狀態值.
返回值:等待到一個子進程返回時,返回值為該子進程號,否則返回值為
-1.同時stat_loc返回子進程的返回值.
例子:pid_t pid;
int stat_loc;
/*父進程*/
if ((pid=fork())>0) {
waitpid(pid,&stat_loc,0);
/*父進程等待進程號為pid的子進程的返回*/
}
else {
/*子進程的處理過程*/
exit(1);
}
/*父進程*/
printf("stat_loc is [%d]\n",stat_loc);
/*字符串"stat_loc is [1]"將被打印出來*/
8.setpgrp()
功能:設置進程組號和會話號.
語法:#include
pid_t setpgrp()
說明:若調用進程不是會話首進程.將進程組號和會話號都設置為與它
的進程號相等.并釋放調用進程的控制終端.
返回值:調用成功后,返回新的進程組號.
例子:/*父進程處理*/
if (fork()>0) {
/*父進程處理*/
}
else {
setpgrp();
/*子進程的進程組號已修改成與它的進程號相同*/
exit(0);
}
9.exit()
功能:終止進程.
語法:#include
void exit(status)
int status;
說明:調用進程被該系統調用終止.引起附加的處理在進程被終止前全
部結束.
返回值:無
10.signal()
功能:信號管理功能
語法:#include
void (*signal(sig,disp))(int)
int sig;
void (*disp)(int);
void (*sigset(sig,disp))(int)
int sig;
void (*disp)(int);
int sighold(sig)
int sig;
int sigrelse(sig)
int sig;
int sigignore(sig)
int sig;
int sigpause(sig)
int sig;
說明:這些系統調用提供了應用程序對指定信號的簡單的信號處理.
signal()和sigset()用于修改信號定位.參數sig指定信號(除了
SIGKILL和SIGSTOP,這兩種信號由系統處理,用戶程序不能捕捉到)
.
disp指定新的信號定位,即新的信號處理函數指針.可以為
SIG_IGN,SIG_DFL或信號句柄地址.
若使用signal(),disp是信號句柄地址,sig不能為SIGILL,SIGTRAP
或SIGPWR,收到該信號時,系統首先將重置sig的信號句柄為SIG_DF
L,
然后執行信號句柄.
若使用sigset(),disp是信號句柄地址,該信號時,系統首先將該
信號加入調用進程的信號掩碼中,然后執行信號句柄.當信號句柄
運行結束
后,系統將恢復調用進程的信號掩碼為信號收到前的狀態.另外,
使用sigset()時,disp為SIG_HOLD,則該信號將會加入調用進程的
信號掩碼中而信號的定位不變.
sighold()將信號加入調用進程的信號掩碼中.
sigrelse()將信號從調用進程的信號掩碼中刪除.
sigignore()將信號的定位設置為SIG_IGN.
sigpause()將信號從調用進程的信號掩碼中刪除,同時掛起調用
進程直到收到信號.
若信號SIGCHLD的信號定位為SIG_IGN,則調用進程的子進程在終
止時不會變成僵死進程.調用進程也不用等待子進程返回并做相
應處理.
返回值:調用成功則signal()返回最近調用signal()設置的disp的值.
否則返回SIG_ERR.
例子一:設置用戶自己的信號中斷處理函數,以SIGINT信號為例:
int flag=0;
void myself()
{
flag=1;
printf("get signal SIGINT\n");
/*若要重新設置SIGINT信號中斷處理函數為本函數則執行以
*下步驟*/
void (*a)();
a=myself;
signal(SIGINT,a);
flag=2;
}
main()
{
while (1) {
sleep(2000); /*等待中斷信號*/
if (flag==1) {
printf("skip system call sleep\n");
exit(0);
}
if (flag==2) {
printf("skip system call sleep\n");
printf("waiting for next signal\n");
}
}
}
11.kill()
功能:向一個或一組進程發送一個信號.
語法:#include
#include
int kill(pid,sig);
pid_t pid;
int sig;
說明:本系統調用向一個或一組進程發送一個信號,該信號由參數sig指
定,為系統給出的信號表中的一個.若為0(空信號)則檢查錯誤但
實際上并沒有發送信號,用于檢查pid的有效性.
pid指定將要被發送信號的進程或進程組.pid若大于0,則信號將
被發送到進程號等于pid的進程;若pid等于0則信號將被發送到所
有的與發送信號進程同在一個進程組的進程(系統的特殊進程除
外);若pid小于-1,則信號將被發送到所有進程組號與pid絕對值
相同的進程;若pid等于-1,則信號將被發送到所有的進程(特殊系
統進程除外).
信號要發送到指定的進程,首先調用進程必須有對該進程發送信
號的權限.若調用進程有合適的優先級則具備有權限.若調用進程
的實際或有效的UID等于接收信號的進程的實際UID或用setuid()
系統調用設置的UID,或sig等于SIGCONT同時收發雙方進程的會話
號相同,則調用進程也有發送信號的權限.
若進程有發送信號到pid指定的任何一個進程的權限則調用成功,
否則調用失敗,沒有信號發出.
返回值:調用成功則返回0,否則返回-1.
例子:假設前一個例子進程號為324,現向它發一個SIGINT信號,讓它做
信號處理:
kill((pid_t)324,SIGINT);
12.alarm()
功能:設置一個進程的超時時鐘.
語法:#include
unsigned int alarm(sec)
unsigned int sec;
說明:指示調用進程的超時時鐘在指定的時間后向調用進程發送一個
SIGALRM信號.設置超時時鐘時時間值不會被放入堆棧中,后一次
設置會把前一次(還未到超時時間)沖掉.
若sec為0,則取消任何以前設置的超時時鐘.
fork()會將新進程的超時時鐘初始化為0.而當一個進程用exec()
族系統調用新的執行文件時,調用前設置的超時時鐘在調用后仍
有效.
返回值:返回上次設置超時時鐘后到調用時還剩余的時間秒數.
例子:int flag=0;
void myself()
{
flag=1;
printf("get signal SIGALRM\n");
/*若要重新設置SIGALRM信號中斷處理函數為本函數則執行
*以下步驟*/
void (*a)();
a=myself;
signal(SIGALRM,a);
flag=2;
}
main()
{
alarm(100); /*100秒后發超時中斷信號*/
while (1) {
sleep(2000); /*等待中斷信號*/
if (flag==1) {
printf("skip system call sleep\n");
exit(0);
}
if (flag==2) {
printf("skip system call sleep\n");
printf("waiting for next signal\n");
}
}
}
13.msgsnd()
功能:發送消息到指定的消息隊列中.
語法:#include
#include
#include
int msgsnd(msqid,msgp,msgsz,msgflg)
int msqid;
void *msgp;
size_t msgsz;
int msgflg;
說明:發送一個消息到由msqid指定消息隊列標識號的消息隊列.
參數msgp指向一個用戶定義的緩沖區,并且緩沖區的第一個域應
為長整型,指定消息類型,其他數據放在緩沖區的消息中其他正文
區內.下面是消息元素定義:
long mtype;
char mtext[];
mtype是一個整數,用于接收進程選擇消息類型.
mtext是一個長度為msgsz字節的任何正文,參數msgsz可從0到系
統允許的最大值間變化.
msgflg指定操作行為:
. 若(msgflg&IPC_NOWAIT)是真的,消息并不是被立即發送而調用
進程會立即返回.
. 若(msgflg&IPC_NOWAIT)不是真的,則調用進程會被掛起直到下
面情況之一發生:
* 消息被發送出去.
* 消息隊列標志被系統刪除.系統調用返回-1.
* 調用進程接收到一個未被忽略的中斷信號,調用進程繼續
執行或被終止.
調用成功后,對應指定的消息隊列的相關結構做如下動作:
. 消息數(msg_qnum)加1.
. 消息隊列最近發送進程號(msg_lspid)改為調用進程號.
. 消息隊列發送時間(msg_stime)改為當前系統時間.
以上信息可用命令ipcs -a看到.
返回值:成功則返回0,否則返回-1
14.msgrcv()
功能:從消息隊列中取得指定類型的消息.
語法:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(msqid,msgp,msgsz,msgtyp,msgflg)
int msqid;
void *msgp;
int msgsz;
long msgtyp;
int msgflg;
說明:本系統調用從由msqid指定的消息隊列中讀取一個由msgtyp指定
類型的消息到由msgp指向的緩沖區中,同樣的,該緩沖區的結構如
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -