参考 linux 网络编程第二版 敲

发现 出错了... ...

网上也没有特别多的参考程序。后来在 man msgrcv 里面找到了参考程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> struct msgbuf {
long mtype;
char mtext[80];
}; static void
usage(char *prog_name, char *msg)
{
if (msg != NULL)
fputs(msg, stderr); fprintf(stderr, "Usage: %s [options]\n", prog_name);
fprintf(stderr, "Options are:\n");
fprintf(stderr, "-s send message using msgsnd()\n");
fprintf(stderr, "-r read message using msgrcv()\n");
fprintf(stderr, "-t message type (default is 1)\n");
fprintf(stderr, "-k message queue key (default is 1234)\n");
exit(EXIT_FAILURE);
} static void
send_msg(int qid, int msgtype)
{
struct msgbuf msg;
time_t t;
msg.mtype = msgtype; time(&t);
snprintf(msg.mtext, sizeof(msg.mtext), "a message at %s",
ctime(&t)); if (msgsnd(qid, (void *) &msg, sizeof(msg.mtext),
IPC_NOWAIT) == -1) {
perror("msgsnd error");
exit(EXIT_FAILURE);
}
printf("sent: %s\n", msg.mtext);
} static void
get_msg(int qid, int msgtype)
{
struct msgbuf msg; if (msgrcv(qid, (void *) &msg, sizeof(msg.mtext), msgtype,
MSG_NOERROR | IPC_NOWAIT) == -1) {
if (errno != ENOMSG) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("No message available for msgrcv()\n");
} else
printf("message received: %s\n", msg.mtext);
} int
main(int argc, char *argv[])
{
int qid, opt;
int mode = 0; /* 1 = send, 2 = receive */
int msgtype = 1;
int msgkey = 1234; while ((opt = getopt(argc, argv, "srt:k:")) != -1) {
switch (opt) {
case 's':
mode = 1;
break;
case 'r':
mode = 2;
break;
case 't':
msgtype = atoi(optarg);
if (msgtype <= 0)
usage(argv[0], "-t option must be greater than 0\n");
break;
case 'k':
msgkey = atoi(optarg);
break;
default:
usage(argv[0], "Unrecognized option\n");
}
} if (mode == 0)
usage(argv[0], "must use either -s or -r option\n"); qid = msgget(msgkey, IPC_CREAT | 0666); if (qid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
} if (mode == 2)
get_msg(qid, msgtype);
else
send_msg(qid, msgtype); exit(EXIT_SUCCESS);
}

首先一定要会用errno

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <sys/ipc.h>
void msg_show_attr(int msg_id, struct msqid_ds msg_info)
{
int ret = -1;
sleep(1);
ret = msgctl(msg_id, IPC_STAT, &msg_info);
if(-1 == ret)
{
printf("获取消息失败 ***** %d \n",errno);
return ;
}
printf("\n"); printf("现在队列中的字节数:%ld\n",msg_info.msg_cbytes); printf("队列中的消息数:%d\n",(int)msg_info.msg_qnum); printf("队列中最大的字节数:%d\n",(int)msg_info.msg_qbytes); printf("最后发送消息的进程pid: %d\n",msg_info.msg_lspid); printf("最后接受消息的进程pid: %d\n",msg_info.msg_lrpid); printf("最后发送消息的时间:%s",ctime(&(msg_info.msg_stime))); printf("最后接受消息的时间:%s",ctime(&(msg_info.msg_rtime))); printf("最后变化的时间:%s",ctime(&(msg_info.msg_ctime))); printf("消息UID是: %d\n",msg_info.msg_perm.uid); printf("消息GID是: %d\n",msg_info.msg_perm.gid); } int main()
{
int ret = -1;
int msg_flags, msg_id;
key_t key;
int temp;
struct msgmbuf
{
long mtype;
char mtext[10];
};
struct msqid_ds msg_info;
struct msgmbuf msg_mbuf; int msg_sflags,msg_rflags;
char *msgpath = "/ipc/msg/";
key = ftok(msgpath, 'X');
if(key != -1)
{
printf("成功建立\n");
}
else
{
printf("建立失败\n");
}
msg_flags = IPC_CREAT|IPC_EXCL;
msg_id = msgget(key, msg_flags|0777);
if(-1 == msg_id)
{
printf("消息建立失败\n");
return 0;
}
msg_show_attr(msg_id, msg_info); msg_sflags = IPC_NOWAIT;
msg_mbuf.mtype = 220;
memcpy(msg_mbuf.mtext, "abcdef", sizeof("abcdef"));
ret = msgsnd(msg_id, (void *)&msg_mbuf, sizeof("abcdef"),msg_sflags); if(-1 == ret)
{
printf("发送消息失败\n");
}
msg_show_attr(msg_id, msg_info);
msg_rflags = IPC_NOWAIT|MSG_NOERROR;
temp = sizeof(struct msgmbuf) - sizeof(long);
ret = msgrcv(msg_id, (void *)&msg_mbuf,temp, 220,msg_rflags); if(ret == -1)
{
printf("接收消息失败\n");
printf("%d***",errno);
}
else
{
printf("接受消息成功长度是: %d\n",ret);
}
msg_show_attr(msg_id, msg_info); msg_info.msg_perm.uid = 1000;
msg_info.msg_perm.gid = 1000;
//msg_info.msg_qbytes = 120;
ret = msgctl(msg_id, IPC_SET,&msg_info);// 设置消息属性 if(ret == -1)
{
printf("设置消息属性失败\n");
return 0;
}
msg_show_attr(msg_id, msg_info); ret = msgctl(msg_id, IPC_RMID, NULL);
if(-1 == ret)
{
printf("删除消息失败\n");
return 0;
}
return 0;
}

后来修了一个版本 首先 那个消息结构体一定要用long,如果不用long的话。就会一直接收失败errno的意思大概是,没有找到对应的消息类型。

还有一个问题没有解决,就是修改属性是成功的可以,然后就不能成功读取msg_info消息的值,不清楚到底是什么原因。如果有人知道,请留言。。。。。。

errno错误大全

IPC通信的更多相关文章

  1. 【IPC通信】基于管道的popen和pclose函数

    http://my.oschina.net/renhc/blog/35116 [IPC通信]基于管道的popen和pclose函数 恋恋美食  恋恋美食 发布时间: 2011/11/12 23:20 ...

  2. Binder机制,从Java到C (9. IPC通信过程)

    1.一次IPC通信過程的幾個步驟 一次通信过程简单的说有下面5个步骤,第一眼看上去,肯定不知道什么玩意,多看几遍,慢慢看,其实是能理解的. 1. Client将数据封装成Parcel. (前面已经讲过 ...

  3. Android Binder机制详解:手写IPC通信

    想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...

  4. IPC通信:Posix消息队列

    IPC通信:Posix消息队列 消息队列可以认为是一个链表.进程(线程)可以往里写消息,也可以从里面取出消息.一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息. ...

  5. linux进程篇 (三) 进程间的通信3 IPC通信

    3 IPC通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...

  6. android IPC通信(上)-sharedUserId&amp;&amp;Messenger

    看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一 ...

  7. python 之 并发编程(守护进程、互斥锁、IPC通信机制)

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  8. 4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型

    一.守护进程 import random import time from multiprocessing import Process def task(): print('name: egon') ...

  9. 笔记六:进程间的通信(IPC通信之消息队列)

    IPC通信之消息队列 "消息"是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象 .消息被发送到队列中."消息队列&q ...

  10. 笔记五:进程间的通信(IPC通信之共享内存)

    IPC通信 IPC通信(Inter-Process Communication) 三种: 共享内存.消息队列.信号灯 这个IPC对象,肯定是存在于内核中.而且用户空间的文件系统中有没有IPC的文件类型 ...

随机推荐

  1. 2025dsfz集训Day3:DFS搜索与剪枝

    DAY3: DFS搜索与剪枝 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling 深搜 深度优 ...

  2. mysql8.0.16 设置远程主机访问

    新版的的mysql版本已经将创建账户和赋予权限的方式分开了 1.创建账户 create user 'root'@'%' identified by '123456'; 注意密码是否符合要求,我用的阿里 ...

  3. Springboot 的一些默认配置规则

    说明 本文样例说明仅适用 maven 环境和语法,但所述内容也适用 gradle 原文地址:https://www.cnblogs.com/qnlcy/p/15905544.html 一.日志 1. ...

  4. RocketMQ半消息对消费者不可见是如何实现的?——事务消息机制揭秘

    首发于工号[BiggerBoy],原文链接 --"半消息藏在这里,但为什么你偷看也没用?" 上篇<RocketMQ系列笔记(三):消息模型与高阶玩法,顺序事务消息拿捏指南&g ...

  5. Vue中的APP与js的对象字面量

    JavaScript的对象字面量是一种方便创建和初始化对象的语法.它允许您直接在代码中定义对象,而无需使用类或构造函数.对象字面量使用大括号{}括起来,并包含零个或多个键值对. 以下是JavaScri ...

  6. Django 中URL和Views相关知识梳理(极简版)

    提示:仅供梳理参考,很多相关的细节内容忽略. 1.URL  (1)URL匹配的规则是正则,关于正则不再赘述. (2)URL优先级顺序:从urlpatterns的底部开始搜索,一直往上搜索,需要注意的是 ...

  7. MybatisPlus查询一对多list结果collection实例

    前言 查询用户信息,结果放到一个实体类里 这个实体类里有两个List<对象>字段,分别是这个用户的角色列表.岗位列表 以下仅供参考 实体类 package cn.daenx.myadmin ...

  8. Docker拉取镜像时的疑惑

    Docker拉取镜像时的疑惑 不知道你在拉取镜像的时候会不会有这样的疑惑--我不是只拉取了一个镜像嘛,为什么会出现这么多的东西 Docker中Layer(层)的概念 在 Docker 中,镜像(Ima ...

  9. Jenkins概述及Linux系统中安装

    概述 官网:https://www.jenkins.io/ GitHub地址:https://github.com/jenkinsci/jenkins Jenkins是一个用Java编写的开源的持续集 ...

  10. Springboot笔记<9>使用Javaweb原生组件

    使用Javaweb原生组件 Javaweb的三大组件:servlet,Filter,Listener,Servlet 3.0 提供了以下 3 个注解: @WebServlet:用于声明一个 Servl ...