IPC通信
参考 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通信的更多相关文章
- 【IPC通信】基于管道的popen和pclose函数
http://my.oschina.net/renhc/blog/35116 [IPC通信]基于管道的popen和pclose函数 恋恋美食 恋恋美食 发布时间: 2011/11/12 23:20 ...
- Binder机制,从Java到C (9. IPC通信过程)
1.一次IPC通信過程的幾個步驟 一次通信过程简单的说有下面5个步骤,第一眼看上去,肯定不知道什么玩意,多看几遍,慢慢看,其实是能理解的. 1. Client将数据封装成Parcel. (前面已经讲过 ...
- Android Binder机制详解:手写IPC通信
想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...
- IPC通信:Posix消息队列
IPC通信:Posix消息队列 消息队列可以认为是一个链表.进程(线程)可以往里写消息,也可以从里面取出消息.一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息. ...
- linux进程篇 (三) 进程间的通信3 IPC通信
3 IPC通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...
- android IPC通信(上)-sharedUserId&&Messenger
看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一 ...
- python 之 并发编程(守护进程、互斥锁、IPC通信机制)
9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...
- 4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型
一.守护进程 import random import time from multiprocessing import Process def task(): print('name: egon') ...
- 笔记六:进程间的通信(IPC通信之消息队列)
IPC通信之消息队列 "消息"是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象 .消息被发送到队列中."消息队列&q ...
- 笔记五:进程间的通信(IPC通信之共享内存)
IPC通信 IPC通信(Inter-Process Communication) 三种: 共享内存.消息队列.信号灯 这个IPC对象,肯定是存在于内核中.而且用户空间的文件系统中有没有IPC的文件类型 ...
随机推荐
- windows下jdk版本切换(bat)
1.jdk下载 Oracle官网 https://www.oracle.com/cn/ 资源->下载->Java下载 jdk当前最新版本 jdk22版本 jdk8版本 当前页面向下拉 2. ...
- python Response的语法
-- r.status_code #响应状态码 -- r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩 -- r.headers #以字典对象存储服务器响应头 ...
- 基于Zabbix Low-level discovery 方式 网络质量监控配置手册
- 1安装docker
1安装docker 1.1主机环境 ssh://192.168.30.30:22 root 123QWEasd 1.2安装依赖 docker依赖于系统的一些必要的工具,可以提前安装. yum ...
- java 单链表实现栈
package com.company;public class Main { //用链表模拟栈 public static void main(String[] args) { // write y ...
- C#线程池核心技术:从原理到高效调优的实用指南
1. 引言 在现代软件开发中,多线程编程是提升应用程序性能的关键手段.随着多核处理器的普及,合理利用并发能力已成为开发者的重要课题.然而,线程的创建和销毁是一个昂贵的过程,涉及系统资源的分配与回收,频 ...
- Nohup 启动程序未指定输出日志,导致磁盘空间被占满的解决方案
1. 问题原因 当使用 nohup 启动程序时,默认情况下,标准输出(stdout)和标准错误(stderr)都会被重定向到 nohup.out 文件.例如: nohup python my_scri ...
- RBMQ与odoo15的集成
背景:在对接物联网设备时候常用的协议就是:MQTT.AMQ.https.还有WebSocket,此案例就是针对接物联网设备传输的消息的消费 原理:通过新建守护线程的方式来启动mq服务,来消费设备平台端 ...
- PLsql and 汉化包的安装使用
一.准备工作 1.点击下载PLSQL,本次安装的PLSQL版本为12.0.7,建议安装64位. 2.下载PLSQL时,版本旁边会有个"Language pack"的链接,点击后左侧 ...
- ImportError: lxml.html.clean module is now a separate project lxml_html_clean
导包报错 from lxml_html_clean import Cleaner 解决报错:"ImportError: lxml.html.clean module is now a sep ...