UC编程9-管道pipe操作和共享内存段shm操作

简介: //myuc.h #include//io流#include//标准库#include//uc标准头文件#include//文件控制#include//c字符串#include#include//内存映射#include//文...

//myuc.h

#include<stdio.h>//io流
#include<stdlib.h>//标准库
#include<unistd.h>//uc标准头文件
#include<fcntl.h>//文件控制
#include<string.h>//c字符串
#include<sys/types.h>
#include<sys/mman.h>//内存映射
#include<sys/stat.h>//文件状态信息
#include<sys/wait.h>//进程等等
#include<dirent.h>//目录操作
#include<signal.h>//信号
#include<sys/time.h>//时间,计时器
#include<sys/ipc.h>//ipc进程间通信
#include<sys/shm.h>//共享内存段
#include<sys/msg.h>//消息队列



//9piperead.c

/*
 创建管道文件命令:mkfifo 9.pipe
管理文件只是进程间通信的一个媒介,它不会存储数据,必须是一边写一边读
 */
#include "myuc.h"
//从管道读取内容
void test1()
{
	int fd=open("9.pipe",O_RDONLY);
	if(fd==-1) perror("open read"),exit(-1);
	int i;
	for(i=0;i<50;i++){
		int t;
		read(fd,&t,4);printf("read:%d\n",t);
		//usleep(100000);
	}
	close(fd);
}
int main(){
	test1();
	return 0;
}

//9pipewrite.c

#include "myuc.h"
//写内容到管道,必须有读文件对应,不然会一直阻塞进程。
void test1()
{
	int fd=open("9.pipe",O_WRONLY);
	if(fd==-1) perror("open write"),exit(-1);
	int i;
	for(i=0;i<50;i++){
		write(fd,&i,4);printf("write:%d\n",i);
		usleep(300000);
	}
	close(fd);
}
int main(){
	test1();
	return 0;
}

//9shma.c

#include "myuc.h"
int main(){//共享内存段操作-创建和存入数据
	key_t key=ftok(".",10);
	if(key==-1) perror("ftok"),exit(-1);
	printf("key=%x\n",key);
	int sid=shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
	if(sid==-1) perror("shmget"),exit(-2);
	void*p=shmat(sid,0,0);
	if(p==(void*)-1) perror("shmat"),exit(-3);
	printf("id=%d,挂接成功\n",sid);
	int* pi=p;
	*pi=100;
	printf("写入成功\n");
	shmdt(p);
	return 0;
}

//9shmb.c

#include "myuc.h"
int main(){//共享内存段操作-挂接和取出数据
	key_t key=ftok(".",10);
	if(key==-1) perror("ftok"),exit(-1);
	printf("key=%x\n",key);
	int sid=shmget(key,0,0);
	if(sid==-1) perror("shmget"),exit(-2);
	void*p=shmat(sid,0,0);
	if(p==(void*)-1) perror("shmat"),exit(-3);
	printf("id=%d,挂接成功\n",sid);
	int *pi=p;
	
	printf("取出数据%d\n",*pi);
	sleep(10);
	shmdt(p);
	return 0;
}

//9shmctl.c

#include "myuc.h"
int main()
{//共享内存段操作-获取状态和修改权限/删除操作
	key_t key=ftok(".",10);
	int sid=shmget(key,0,0);//获取id
	//创建 shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
	if(sid==-1) perror("shmget"),exit(-1);
	struct shmid_ds ds;
	shmctl(sid,IPC_STAT,&ds);//状态存入ds
	printf("key=%x,mode=%o\n",
			ds.shm_perm.__key,(int)ds.shm_perm.mode);
	printf("size=%d,nattch=%d\n",
			(int)ds.shm_segsz,(int)ds.shm_nattch);
	ds.shm_perm.mode=0660;//能修改权限
	ds.shm_segsz=8;//不能修改大小
	shmctl(sid,IPC_SET,&ds);
	shmctl(sid,IPC_RMID,0);//删除
	return 0;
	
}


相关文章
|
3月前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
Java并发编程进阶:深入理解Java内存模型
46 0
|
4月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
56 0
|
2月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
2月前
|
存储 并行计算 算法
CUDA统一内存:简化GPU编程的内存管理
在GPU编程中,内存管理是关键挑战之一。NVIDIA CUDA 6.0引入了统一内存,简化了CPU与GPU之间的数据传输。统一内存允许在单个地址空间内分配可被两者访问的内存,自动迁移数据,从而简化内存管理、提高性能并增强代码可扩展性。本文将详细介绍统一内存的工作原理、优势及其使用方法,帮助开发者更高效地开发CUDA应用程序。
|
2月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
6月前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
【4月更文挑战第6天】Java内存模型(JMM)是多线程编程的关键,定义了线程间共享变量读写的规则,确保数据一致性和可见性。主要包括原子性、可见性和有序性三大特性。Happens-Before原则规定操作顺序,内存屏障和锁则保障这些原则的实施。理解JMM和相关机制对于编写线程安全、高性能的Java并发程序至关重要。
62 1
|
3月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
在操作系统中,进程间通信(IPC)是至关重要的,它提供了多种机制来实现不同进程间的数据交换和同步。本篇文章将详细介绍几种常见的IPC方式,包括管道、信号、消息队列、共享内存、信号量和套接字,帮助你深入理解并合理应用这些通信方式,提高系统性能与可靠性。
361 0
|
4月前
|
消息中间件 分布式计算 网络协议
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
进程间通信(Inter-Process Communication, IPC)是计算机科学中的一个重要概念,指的是运行在同一系统或不同系统上的多个进程之间互相发送和接收信息的能力。IPC机制允许进程间共享数据、协调执行流程,是实现分布式系统、多任务操作系统和并发编程的基础。
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
|
5月前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
|
5月前
|
算法 Linux 测试技术
Linux编程:测试-高效内存复制与随机数生成的性能
该文探讨了软件工程中的性能优化,重点关注内存复制和随机数生成。文章通过测试指出,`g_memmove`在内存复制中表现出显著优势,比简单for循环快约32倍。在随机数生成方面,`GRand`库在1000万次循环中的效率超过传统`rand()`。文中提供了测试代码和Makefile,建议在性能关键场景中使用`memcpy`、`g_memmove`以及高效的随机数生成库。