进程间通信:

   System V IPC对象:      

         ipcs -q:查看消息队列   ipcs -m:查看共享内存  ipcs -s:查看信号灯集

         ipcrm -q:删除消息队列   ipcrm -m:删除共享内存  ipcrm -s:删除信号灯集

         **:每一个IPC对象都有一个ID,可根据key值得到ID;

         key_t ftok(const char *pathname, int proj_id);    // pathname:你指定的文件名(该文件必须是存在而且可以访问的)  proj_id:是子序号,虽然为int,但是只有8个bit被使用(0-255)。   

   1.消息队列:

      特点: 

        1)任意进程间通信

        2)以整个数据发送,保证数据完整性

        3)可以通过类型发送和接收,考虑消息的优先级和多个进程间通信比较简单

      步骤

        1)创建消息队列  int msgget(key_t key, int msgflg); //key:key值   

                                 // msgflag: IPC_CREAT |0666:创建新的消息队列。 IPC_EXCL:与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误

                 在以下两种情况下,将创建一个新的消息队列:               

                               1、如果键的值是IPC_PRIVATE。

                            2、或者键的值不是IPC_PRIVATE,并且键所对应的消息队列不存在,同时标志中指定IPC_CREAT        

 

        2)发送      int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

                       msqid:msqid表示发送消息的消息队列id
                                         msgp:msgq结构体指针,表示发送消息的存储空间的起始地址
                                                struct msgbuf {
                                                          long mtype;       /* message type, must be > 0 */
                                                          char mtext[1];    /* message data,消息的存储空间,用户需要根据消息的字节数来自定义大小,需要小于等于MSGMNB */
                                                      };
                                        msgsz: msgsz表示的消息内容数组空间的大小;
                                       msgflg:msgflg表示消息发送的方式:
                                                0:表示阻塞方式发送,只有当消息发送完成才会返回; IPC_NOWAIT:非阻塞方式发送,不管消息是否发送完成,都会立即返回;  
             

        3)接收      ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

                        msqid:msqid表示接收消息的消息队列id
                                        msgp:msgq结构体指针,表示接收消息的存储空间的起始地址;
                                        msgsz:msgsz表示的消息内容数组空间的大小;
                                       msgtyp:msgtyp接收消息的类型:
                                                msgtyp = 0, 接收消息对列中的第一条消息;
                                                msgtyp > 0, 接收消息队列中类型为msgtyp的第一条消息;
                                                msgtyp < 0, 接收消息队列中类型<=|msgtyp|中类型最小的第一条消息;
                                        msgflg:msgflg表示消息发送的方式:
                                              0:表示阻塞方式接收,只有当消息接收完成才会返回;
                                              IPC_NOWAIT:非阻塞方式接收,不管消息是否接收完成,都会立即返回;

        4)删除消息队列  int msgctl(int msqid, int cmd, struct msqid_ds *buf);

                       msqid:消息队列id

                       cmd:控制操作  
                                IPC_STAT:把msqid_ds结构中的数据设置为消息队列的当前关联值
                                IPC_SET:在进程有足够权限的前提下,把消息队列的当前关联值设置为msqid ds数据结构中给出的值
                                   IPC_ RMID:删除消息队列

                       buf:设置数据结构值     

      

posted on 2020-09-20 21:56  ღ惟吾德馨ღ  阅读(153)  评论(0)    收藏  举报