linux进程通信(二)--消息队列

本文提供了一组基于消息队列实现进程间通信的C语言示例代码,包括服务器端和服务端程序。通过创建和使用消息队列进行数据收发,展示了基本的消息队列通信流程。
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. }
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. }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值