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

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

}
时间: 2024-10-27 20:27:51

UC编程9-管道pipe操作和共享内存段shm操作的相关文章

两个进程间能使用共享内存段进行数据共享吗?

问题描述 两个进程间能使用共享内存段进行数据共享吗? 我是这样做的: 在一个dll里面定义一个共享数据段,里面定义一个整形数据,然后定义两个导出函数对这个整形数据进行操作. #pragma data_seg ("ShareDataSeg") //开辟一个名字为"ShareDataSeg"的共享内存段 int g_nShareInt = 0; #pragma data_seg() //共享内存段"ShareDataSeg"定义结束 //加上这条声明

php共享内存段示例分享

 在asp.net和java中都有共享内存,php除了可以使用Memcached等方式变通以外其实php也是支持共享内存的,下面使用shmop来实现这个功能   需要安装扩展shmop 找到php安装源文件目录     代码如下: # cd /usr/local/php-5.4.0/ext/shmop # /usr/local/php/bin/phpize # ./configure --with-php-config=/usr/local/php/bin/php-config #  make

php共享内存段示例分享_php实例

 需要安装扩展shmop找到php安装源文件目录 复制代码 代码如下: # cd /usr/local/php-5.4.0/ext/shmop# /usr/local/php/bin/phpize# ./configure --with-php-config=/usr/local/php/bin/php-config#  make && make install 编译安装成功 复制代码 代码如下: # cd /usr/local/php/lib/php/extensions/no-debu

PHP 直接在共享内存中存储数据集

共享内存是一种在相同机器中的应用程序之间交换数据的有效方式.一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限.每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指向一个物理内存区域,其他进程可在该区域操作它.创建并提供了合适的权限之后,同一台机器中的其他进程就可以操作这些内存段:读取.写入和删除. 这表明使用 C 语言编写的应用程序可与使用其他语言(比如 Java 或 PHP)编写的应用程序共享信息.它们都可以共享信息,只要它们可访问和理解该信息.共享内存在针对大

UC编程6-目录操作和创建子进程fork()函数1

//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>//文件状

UC编程7-进程创建函数fork/vfork 和 execl/信号signal的使用1

//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>//文件状

UC编程8-信号发送函数kill/raise/setitimer/alarm和信号集函数segprocmask

//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>//文件状

UC编程5-fcntl函数获取文件状态和加锁解锁/dup函数和文件映射

//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>//文件状

单台服务器的PHP进程之间实现共享内存的方法_php技巧

开发人员要想使php进程实现共享内存的读写,首先就要支持IPC函数,即php编译安装时指定:--enable-shmop  与--enable-sysvsem 两个选项. IPC (Inter-process communication) 是一个Unix标准机制,它提供了使得在同一台主机不同进程之间可以互相的方法.基本的IPC处理机制有3种:它们分别是共享内存.信号量和消息队列.本文中我们主要讨论共享内存和信号量的使用. 在不同的处理进程之间使用共享内存是一个实现不同进程之间相互的好方法.如果你