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