zoukankan      html  css  js  c++  java
  • Linux进程间通信——消息队列

    消息队列是消息的链接表,包括Posix消息队列system V消息队列。消息队列用于运行于同一台机器上的进程间通信,它
    和管道很相似,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了
    信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 我们可以用流管道或者套接口的方式来取代它。

    查询系统消息队列:ipcs -q

    #include <sys/types.h>

    #include <sys/ipc.h>

    #include <sys/msg.h>

    int msgctl(int msqid, int cmd, struct msqid_ds *buf);

    int msgget(key_t key, int msgflg);

    int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

    int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);


    C代码
    1. /*msgserver.c*/ 
    2.  
    3. #include <stdlib.h> 
    4. #include <string.h> 
    5. #include <errno.h> 
    6. #include <sys/types.h> 
    7. #include <sys/ipc.h> 
    8. #include <sys/msg.h> 
    9. #include <sys/stat.h> 
    10.  
    11. #define   MSG_FILE "msgserver.c"  
    12. #define   BUFFER 255  
    13. #define   PERM S_IRUSR|S_IWUSR  
    14. /* 服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的 */ 
    15. /* ipcrm -q <msqid> */ 
    16.  
    17. struct msgtype  
    18. {  
    19.     long mtype;  
    20.     char buffer[BUFFER+1];  
    21. };  
    22.  
    23. int main()  
    24. {  
    25.     struct msgtype msg;  
    26.     key_t key;  
    27.     int msgid;  
    28.      
    29.     if((key=ftok(MSG_FILE,'a'))==-1)  
    30.     {  
    31.         fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));  
    32.         exit(1);  
    33.     }  
    34.  
    35.     if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)  
    36.     { 
    37.         fprintf(stderr, "Creat Message Error:%s\n", strerror(errno));  
    38.         exit(1); 
    39.     }  
    40.     printf("msqid = %d\n", msgid); 
    41.     while(1) 
    42.     {  
    43.         msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);  
    44.         fprintf(stderr,"Server Receive:%s\n", msg.buffer);  
    45.         msg.mtype = 2;  
    46.         msgsnd(msgid, &msg, sizeof(struct msgtype), 0);  
    47.     }  
    48.     exit(0);  
    49. }    
    C代码
    1. /* msgclient.c */ 
    2.  
    3. #include <stdio.h> 
    4. #include <stdlib.h> 
    5. #include <string.h> 
    6. #include <errno.h> 
    7. #include <sys/types.h> 
    8. #include <sys/ipc.h> 
    9. #include <sys/msg.h> 
    10. #include <sys/stat.h> 
    11.  
    12. #define   MSG_FILE "msgserver.c"  
    13. #define   BUFFER 255  
    14. #define   PERM S_IRUSR|S_IWUSR  
    15.  
    16. struct msgtype {  
    17.     long mtype;  
    18.     char buffer[BUFFER+1];  
    19. };  
    20.  
    21. int main(int argc, char **argv)  
    22. {  
    23.     struct msgtype msg;  
    24.     key_t key;  
    25.     int msgid;  
    26.      
    27.     if(argc != 2)  
    28.     {  
    29.         fprintf(stderr,"Usage:%s string\n", argv[0]);  
    30.         exit(1);  
    31.     }  
    32.      
    33.     if((key=ftok(MSG_FILE,'a'))==-1)  
    34.     {  
    35.         fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));  
    36.         exit(1);  
    37.     }  
    38.      
    39.     if((msgid=msgget(key, PERM))==-1)  
    40.     {  
    41.         fprintf(stderr,"Creat Message  Error:%s\n", strerror(errno));  
    42.         exit(1);  
    43.     }  
    44.      
    45.     msg.mtype = 1;  
    46.     strncpy(msg.buffer, argv[1], BUFFER);  
    47.     msgsnd(msgid, &msg, sizeof(struct msgtype), 0);   
    48.     memset(&msg, '\0', sizeof(struct msgtype));  
    49.     msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0);  
    50.     fprintf(stderr, "Client receive:%s\n", msg.buffer);  
    51.     exit(0); 
    52. }   
  • 相关阅读:
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    JAVA面向对象详细总结
    父愁者联盟--需求规格说明书
    案例分析
    软件工程编程作业1
    构建之法观后提问
    第一次随笔——准备工作
  • 原文地址:https://www.cnblogs.com/feisky/p/1693485.html
Copyright © 2011-2022 走看看