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;
	
}


相关文章
|
30天前
|
存储 Linux 编译器
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
50 0
|
13天前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
【4月更文挑战第6天】Java内存模型(JMM)是多线程编程的关键,定义了线程间共享变量读写的规则,确保数据一致性和可见性。主要包括原子性、可见性和有序性三大特性。Happens-Before原则规定操作顺序,内存屏障和锁则保障这些原则的实施。理解JMM和相关机制对于编写线程安全、高性能的Java并发程序至关重要。
|
29天前
|
存储 编解码 Linux
深入解析Linux C/C++ 编程中的内存泄漏问题
深入解析Linux C/C++ 编程中的内存泄漏问题
109 1
|
1月前
|
消息中间件 Linux
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
22 2
|
1月前
|
Linux 数据安全/隐私保护
进程间通信之共享内存及其shm函数的使用【Linux】
进程间通信之共享内存及其shm函数的使用【Linux】
|
2月前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
105 0
|
2月前
|
程序员 编译器 C++
C++核心编程一:内存分区模型(持续更新)
C++核心编程一:内存分区模型(持续更新)
|
2月前
|
存储 缓存 并行计算
DP读书:鲲鹏处理器 架构与编程(四)内存顺序模型与内存屏障
DP读书:鲲鹏处理器 架构与编程(四)内存顺序模型与内存屏障
35 1
|
6月前
|
存储 缓存 分布式数据库
[笔记]Windows核心编程《十七》内存映射文件(二)
[笔记]Windows核心编程《十七》内存映射文件(二)
|
6月前
|
缓存 Java 编译器
[笔记]Windows核心编程《十七》内存映射文件(一)
[笔记]Windows核心编程《十七》内存映射文件