分类: C/C++
2011-12-06 14:17:50
15.msgctl()
功能:消息控制操作
语法:#include
#include
#include
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
#include
#include
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 #include #include 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.