Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1885217
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: C/C++

2011-12-06 14:17:50

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
             #include
             #include
             int msgrcv(msqid,msgp,msgsz,msgtyp,msgflg)
             int msqid;
             void *msgp;
             int msgsz;
             long msgtyp;
             int msgflg;
        说明:本系统调用从由msqid指定的消息队列中读取一个由msgtyp指定
             类型的消息到由msgp指向的缓冲区中,同样的,该缓冲区的结构如
             前所述,包括消息类型和消息正文.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
             #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.

阅读(781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~