?? 多進(jìn)程編程.htm
字號(hào):
msgflg指定操作行為:
. 若(msgflg&IPC_NOWAIT)是真的,消息并不是被立即發(fā)送而調(diào)用
進(jìn)程會(huì)立即返回.
. 若(msgflg&IPC_NOWAIT)不是真的,則調(diào)用進(jìn)程會(huì)被掛起直到下
面情況之一發(fā)生:
* 消息被發(fā)送出去.
* 消息隊(duì)列標(biāo)志被系統(tǒng)刪除.系統(tǒng)調(diào)用返回-1.
* 調(diào)用進(jìn)程接收到一個(gè)未被忽略的中斷信號(hào),調(diào)用進(jìn)程繼續(xù)
執(zhí)行或被終止.
調(diào)用成功后,對(duì)應(yīng)指定的消息隊(duì)列的相關(guān)結(jié)構(gòu)做如下動(dòng)作:
. 消息數(shù)(msg_qnum)加1.
. 消息隊(duì)列最近發(fā)送進(jìn)程號(hào)(msg_lspid)改為調(diào)用進(jìn)程號(hào).
. 消息隊(duì)列發(fā)送時(shí)間(msg_stime)改為當(dāng)前系統(tǒng)時(shí)間.
以上信息可用命令ipcs -a看到.
返回值:成功則返回0,否則返回-1.
14.msgrcv()
功能:從消息隊(duì)列中取得指定類型的消息.
語法:#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;
說明:本系統(tǒng)調(diào)用從由msqid指定的消息隊(duì)列中讀取一個(gè)由msgtyp指定
類型的消息到由msgp指向的緩沖區(qū)中,同樣的,該緩沖區(qū)的結(jié)構(gòu)如
前所述,包括消息類型和消息正文.msgsz為可接收的消息正文的
字節(jié)數(shù).若接收到的消息正文的長度大于msgsz,則會(huì)被截短到
msgsz字節(jié)為止(當(dāng)消息標(biāo)志msgflg&MSG_NOERROR為真時(shí)),截掉的
部份將被丟失,而且不通知消息發(fā)送進(jìn)程.
msgtyp指定消息類型:
. 為0則接收消息隊(duì)列中第一個(gè)消息.
. 大于0則接收消息隊(duì)列中第一個(gè)類型為msgtyp的消息.
. 小于0則接收消息隊(duì)列中第一個(gè)類型值不小于msgtyp絕對(duì)值且
類型值又最小的消息.
msgflg指定操作行為:
. 若(msgflg&IPC_NOWAIT)是真的,調(diào)用進(jìn)程會(huì)立即返回,若沒有
接收到消息則返回值為-1,errno設(shè)置為ENOMSG.
. 若(msgflg&IPC_NOWAIT)不是真的,則調(diào)用進(jìn)程會(huì)被掛起直到下
面情況之一發(fā)生:
* 隊(duì)列中的消息的類型是有效的.
* 消息隊(duì)列標(biāo)志被系統(tǒng)刪除.系統(tǒng)調(diào)用返回-1.
* 調(diào)用進(jìn)程接收到一個(gè)未被忽略的中斷信號(hào),調(diào)用進(jìn)程繼續(xù)
執(zhí)行或被終止.
調(diào)用成功后,對(duì)應(yīng)指定的消息隊(duì)列的相關(guān)結(jié)構(gòu)做如下動(dòng)作:
. 消息數(shù)(msg_qnum)減1.
. 消息隊(duì)列最近接收進(jìn)程號(hào)(msg_lrpid)改為調(diào)用進(jìn)程號(hào).
. 消息隊(duì)列接收時(shí)間(msg_rtime)改為當(dāng)前系統(tǒng)時(shí)間.
以上信息可用命令ipcs -a看到.
返回值:調(diào)用成功則返回值等于接收到實(shí)際消息正文的字節(jié)數(shù).
不成功則返回-1.
15.msgctl()
功能:消息控制操作
語法:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(msqid,cmd,buf)
int msqid,cmd;
struct msqid_ds *buf;
說明:本系統(tǒng)調(diào)用提供一系列消息控制操作,操作動(dòng)作由cmd定義,以下
cmd定義值表明了各操作動(dòng)作的定義.
. IPC_STAT:將msqid相關(guān)的數(shù)據(jù)結(jié)構(gòu)中各個(gè)元素的當(dāng)前值放入由
buf指向的結(jié)構(gòu)中.
. IPC_SET:將msqid相關(guān)的數(shù)據(jù)結(jié)構(gòu)中的下列元素設(shè)置為由buf指
向的結(jié)構(gòu)中的對(duì)應(yīng)值.
msg_perm.uid
msg_perm.gid
msg_perm.mode
msg_qbytes
本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的
進(jìn)程或有效UID有合適權(quán)限的進(jìn)程操作.只有具有合適權(quán)限的
用戶才能增加msg_qbytes的值.
. IPC_RMID:刪除由msqid指示的消息隊(duì)列.將它從系統(tǒng)中刪除并
破壞相關(guān)的數(shù)據(jù)結(jié)構(gòu).
本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的
進(jìn)程或有效UID有合適權(quán)限的進(jìn)程操作.
返回值:調(diào)用成功則返回值為0,否則為-1.
16.msgget()
功能:取得一個(gè)消息隊(duì)列.
語法:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key,msgflg)
key_t key;
int msgflg;
說明:本系統(tǒng)調(diào)用返回與參數(shù)key相關(guān)的消息隊(duì)列的標(biāo)識(shí)符.
若以下事實(shí)成立,則與消息隊(duì)列相關(guān)的標(biāo)識(shí)符和數(shù)據(jù)結(jié)構(gòu)將被創(chuàng)
建出來:
. 若參數(shù)key等于IPC_PRIVATE.
. 若參數(shù)key沒有一個(gè)已存在的消息隊(duì)列標(biāo)識(shí)符與之相關(guān),同時(shí)值
(msgflg&IPC_CREAT)為真.
創(chuàng)建消息隊(duì)列時(shí),與新的消息隊(duì)列標(biāo)識(shí)符相關(guān)的數(shù)據(jù)結(jié)構(gòu)將被初
始化為如下:
. msg_perm.cuid和msg_perm.uid設(shè)置為調(diào)用進(jìn)程的有效UID.
. msg_perm.cgid和msg_perm.gid設(shè)置為調(diào)用進(jìn)程的有效GID.
. msg_perm.mode訪問權(quán)限比特位設(shè)置為msgflg訪問權(quán)限比特位.
. msg_qnum,msg_lspid,msg_lrpid,msg_stime,msg_rtime設(shè)置為0.
. msg_ctime設(shè)置為當(dāng)前系統(tǒng)時(shí)間.
. msg_qbytes設(shè)置為系統(tǒng)允許的最大值.
返回值:調(diào)用成功則返回一非0值,稱為消息隊(duì)列標(biāo)識(shí)符;否則返回值為-1.
例子:本例將包括上述所有消息隊(duì)列操作的系統(tǒng)調(diào)用:
#define RKEY 0x9001L /*讀消息隊(duì)列的KEY值*/
#define WKEY 0x9002L /*寫消息隊(duì)列的KEY值*/
#define MSGFLG 0666 /*消息隊(duì)列訪問權(quán)限*/
#define IPC_WAIT 0 /*等待方式在include文件中未定義*/
int rmsqid; /*讀消息隊(duì)列標(biāo)識(shí)符*/
int wmsqid; /*寫消息隊(duì)列標(biāo)識(shí)符*/
struct msgbuf {
long mtype;
char mtext[200];
} buf;
/*若讀消息隊(duì)列已存在就取得標(biāo)識(shí)符,否則則創(chuàng)建并取得標(biāo)識(shí)符*/
if ((rmsqid=msgget(RKEY,MSGFLG|IPC_CREAT))<0) {
printf("get read message queue failed\n");
exit(1);
}
/*若寫消息隊(duì)列已存在則失敗,若不存在則創(chuàng)建并取得標(biāo)識(shí)符*/
if ((wmsqid=msgget(WKEY,
MSGFLG|IPC_CREAT|IPC_TRUNC))<0) {
printf("get write message queue failed\n");
exit(2);
}
/*接收所有類型的消息*/
if (msgrcv(rmsqid,&buf,sizeof(struct msgbuf)-sizeof(long),
0L,IPC_WAIT)>0)
printf("get %ld type message from queue:%s\n",
buf.mtype,buf.mtext);
else {
printf("get message failed\n");
exit(3);
}
buf.mtype=3L
if (msgsnd(wmsqid,&buf,sizeof(struct msgbuf)-sizeof(long),
IPC_NOWAIT)>0)
printf("send message OK\n");
else {
printf("send message failed\n");
exit(4);
}
msgctl(wmsqid,IPC_RMID,(struct msqid *)NULL);
17.shmat()
功能:聯(lián)接共享內(nèi)存的操作.
語法:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
void *shmat(shmid,shmaddr,shmflg)
int shmid;
void *shmaddr;
int shmid;
說明:將由shmid指示的共享內(nèi)存聯(lián)接到調(diào)用進(jìn)程的數(shù)據(jù)段中.被聯(lián)接的
段放在地址,該地址由以下準(zhǔn)則指定:
. 若shmaddr等于(void *)0,則段聯(lián)接到由系統(tǒng)選擇的第一個(gè)可
用的地址上.
. 若shmaddr不等于(void *)0同時(shí)(shmflg&SHM_RND)值為真,則
段聯(lián)接到由(shmaddr-(shmaddr%SHMLBA))給出的地址上.
. 若shmaddr不等于(void *)0同時(shí)(shmflg&SHM_RND)值為假,則
段聯(lián)接到由shmaddr指定的地址上.
若(shmflg&sSHM_RDONLY)為真并且調(diào)用進(jìn)程有讀允許,則被聯(lián)接
的段為只讀;否則,若值不為真且調(diào)用進(jìn)程有讀寫權(quán)限,則被聯(lián)接
的段為可讀寫的.
返回值:若調(diào)用成功則返回被聯(lián)接的共享內(nèi)存段在數(shù)據(jù)段上的啟始地址.
否則返回值為-1.
18.shmdt()
功能:斷開共享內(nèi)存聯(lián)接的操作.
語法:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
void *shmdt(shmaddr)
void *shmaddr;
說明:本系統(tǒng)調(diào)用將由shmaddr指定的共享內(nèi)存段從調(diào)用進(jìn)程的數(shù)據(jù)段
脫離出去.
返回值:若調(diào)用成功則返回值為0,否則返回值為-1.
19.shmget()
功能:取得共享內(nèi)存段
語法:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key,size,shmflg)
key_t key;
int size,shmflg;
說明:本系統(tǒng)調(diào)用返回key相關(guān)的共享內(nèi)存標(biāo)識(shí)符.
共享內(nèi)存標(biāo)識(shí)符和相關(guān)數(shù)據(jù)結(jié)構(gòu)及至少size字節(jié)的共享內(nèi)存段能
正常創(chuàng)建,要求以下事實(shí)成立:
. 參數(shù)key等于IPC_PRIVATE.
. 參數(shù)key沒有相關(guān)的共享內(nèi)存標(biāo)識(shí)符,同時(shí)(shmflg&IPC_CREAT)
值為真.
共享內(nèi)存創(chuàng)建時(shí),新生成的共享內(nèi)存標(biāo)識(shí)相關(guān)的數(shù)據(jù)結(jié)構(gòu)被初始
化如下:
. shm_perm.cuid和shm_perm.uid設(shè)置為調(diào)用進(jìn)程的有效UID.
. shm_perm.cgid和shm_perm.gid設(shè)置為調(diào)用進(jìn)程的有效GID.
. shm_perm.mode訪問權(quán)限比特位設(shè)置為shmflg訪問權(quán)限比特位.
. shm_lpid,shm_nattch,shm_atime,shm_dtime設(shè)置為0.
. shm_ctime設(shè)置為當(dāng)前系統(tǒng)時(shí)間.
. shm_segsz設(shè)置為0.
返回值:若調(diào)用成功則返回一個(gè)非0值,稱為共享內(nèi)存標(biāo)識(shí)符,否則返回
值為-1.
20.shmctl()
功能:共享內(nèi)存控制操作.
語法:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(shmid,cmd,buf)
int shmid,cmd;
struct shmid_ds *buf;
說明:本系統(tǒng)調(diào)用提供一系列共享內(nèi)存控制操作.操作行為由cmd指定.
以下為cmd的有效值:
. IPC_STAT:將shmid相關(guān)的數(shù)據(jù)結(jié)構(gòu)中各個(gè)元素的當(dāng)前值放入由
buf指向的結(jié)構(gòu)中.
. IPC_SET:將shmid相關(guān)的數(shù)據(jù)結(jié)構(gòu)中的下列元素設(shè)置為由buf指
向的結(jié)構(gòu)中的對(duì)應(yīng)值.
shm_perm.uid
shm_perm.gid
shm_perm.mode
本命令只能由有效UID等于shm_perm.cuid或shm_perm.uid的
進(jìn)程或有效UID有合適權(quán)限的進(jìn)程操作.
. IPC_RMID:刪除由shmid指示的共享內(nèi)存.將它從系統(tǒng)中刪除并
破壞相關(guān)的數(shù)據(jù)結(jié)構(gòu).
本命令只能由有效UID等于shm_perm.cuid或shm_perm.uid的
進(jìn)程或有效UID有合適權(quán)限的進(jìn)程操作.
返回值:若調(diào)用成功則返回0,否則返回-1.
例子:本例包括上述所有共享內(nèi)存操作系統(tǒng)調(diào)用:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHMKEY 74
#define K 1024
int shmid;
cleanup()
{
shmctl(shmid,IPC_RMID,0);
exit(0);
}
main()
{
int *pint;
char *addr1,*addr2;
extern char *shmat();
extern cleanup();
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -