进程间通信的例子-消息队列

编程技术  /  houtizong 发布于 3年前   84
root@ubuntu:~/test/SourceCode/ch14# cat msg1.c /* Here's the receiver program. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/msg.h>struct my_msg_st {    long int my_msg_type;    char some_text[BUFSIZ];};int main(){    int running = 1;    int msgid;    struct my_msg_st some_data;    long int msg_to_receive = 0;/* First, we set up the message queue. */    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);    if (msgid == -1) {        fprintf(stderr, "msgget failed with error: %d\n", errno);        exit(EXIT_FAILURE);    }/* Then the messages are retrieved from the queue, until an end message is encountered. Lastly, the message queue is deleted. */    while(running) {        if (msgrcv(msgid, (void *)&some_data, BUFSIZ,                   msg_to_receive, 0) == -1) {            fprintf(stderr, "msgrcv failed with error: %d\n", errno);            exit(EXIT_FAILURE);        }        printf("You wrote: %s", some_data.some_text);        if (strncmp(some_data.some_text, "end", 3) == 0) {            running = 0;        }    }    if (msgctl(msgid, IPC_RMID, 0) == -1) {        fprintf(stderr, "msgctl(IPC_RMID) failed\n");        exit(EXIT_FAILURE);    }    exit(EXIT_SUCCESS);}root@ubuntu:~/test/SourceCode/ch14# 

root@ubuntu:~/test/SourceCode/ch14# cat msg2.c  /* The sender program is very similar to msg1.c. In the main set up, delete the msg_to_receive declaration and replace it with buffer[BUFSIZ], remove the message queue delete and make the following changes to the running loop. We now have a call to msgsnd to send the entered text to the queue. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/msg.h>#define MAX_TEXT 512struct my_msg_st {    long int my_msg_type;    char some_text[MAX_TEXT];};int main(){    int running = 1;    struct my_msg_st some_data;    int msgid;    char buffer[BUFSIZ];    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);    if (msgid == -1) {        fprintf(stderr, "msgget failed with error: %d\n", errno);        exit(EXIT_FAILURE);    }    while(running) {        printf("Enter some text: ");        fgets(buffer, BUFSIZ, stdin);        some_data.my_msg_type = 1;        strcpy(some_data.some_text, buffer);        if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) {            fprintf(stderr, "msgsnd failed\n");            exit(EXIT_FAILURE);        }        if (strncmp(buffer, "end", 3) == 0) {            running = 0;        }    }    exit(EXIT_SUCCESS);}root@ubuntu:~/test/SourceCode/ch14# 


上一篇:svgalib的helloworld
下一篇:c语言的helloworld

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客