share memory

header for public argument:shmdata.h

#define TEXT_SZ 2048

struct shared_use_st

{

int written;

char text[TEXT_SZ];

};

#endif

shmread.c

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/shm.h>

#include "shmdata.h"

int main()

{

int running = 1;

void *shm = NULL;

struct shared_use_st *shared;

int shmid;

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);

if(shmid == -1)

{

fprintf(stderr, "shmget failed\n");

exit(EXIT_FAILURE);

}

shm = shmat(shmid, 0, 0);

if(shm == (void*)-1)

{

fprintf(stderr, "shmat failed\n");

exit(EXIT_FAILURE);

}

shared = (struct shared_use_st*)shm;

shared->written = 0;

while(running)

{

if(shared->written != 0)

{

printf("You wrote: %s", shared->text);

sleep(rand() % 3);

shared->written = 0;

if(strncmp(shared->text, "end", 3) == 0)

running = 0;

}

else

sleep(1);

}

if(shmdt(shm) == -1)

{

fprintf(stderr, "shmdt failed\n");

exit(EXIT_FAILURE);

}

if(shmctl(shmid, IPC_RMID, 0) == -1)

{
                fprintf(stderr, "shmctl(IPC_RMID) failed\n");
                exit(EXIT_FAILURE);
        }
        exit(EXIT_SUCCESS);
}

shmwrite.c

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/shm.h>

#include "shmdata.h"

int main()

{

int running = 1;

void *shm = NULL;

struct shared_use_st *shared = NULL;

char buffer[BUFSIZ + 1];

int shmid;

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);

if(shmid == -1)

{

fprintf(stderr, "shmget failed\n");

exit(EXIT_FAILURE);

}

shm = shmat(shmid, (void*)0, 0);

if(shm == (void*)-1)

{

fprintf(stderr, "shmat failed\n");

exit(EXIT_FAILURE);

}

shared = (struct shared_use_st*)shm;

while(running)

  {

while(shared->written == 1)

{

sleep(1);

printf("Waiting...\n");

}

printf("Enter some text: ");

fgets(buffer, BUFSIZ, stdin);

strncpy(shared->text, buffer, TEXT_SZ);

shared->written = 1;

if(strncmp(buffer, "end", 3) == 0)

running = 0;

}

if(shmdt(shm) == -1)

{

fprintf(stderr, "shmdt failed\n");

exit(EXIT_FAILURE);

}

sleep(2);
        exit(EXIT_SUCCESS);
}

时间: 2024-10-12 18:17:59

share memory的相关文章

Share memory中bank conflict问题

Share memory是片上资源,生命周期是整个block中,它的数据读写十分快,有1个cycle latency.在Share memory中,经常存在bank conflict问题,如果没有bank conflict问题,它的数据读写可以和片上的寄存器(Register)一样快.因此,我们需要尽量减少bank conflicts. 首先,什么是bank?我们以capability 1.x为例,Share memory被等分成同等尺寸大小的存储器模式,即banks,以下图为例: 每一个ban

share memory between guest and nic

通过硬件的IOMMU,内核提供的共享内存.VFIO可以实现. REF: 1. offical DPDK API Doc, 简书有翻译版 DPDK编程指南(翻译)(一)  (二十七) 2. dpdk vhost研究(一)/(二) 3. vhost-user 与其他的对比 virtio,vhost 和vhost-user 文件共享 Linux文件共享(六)——描述符传递 qemu 与DPDK共享内存,是通过传递fd(fd是进程独享的,同一文件,两个进程间的fd可能不同)的方式实现的.所以实现fd传输

zabbix问题:cannot allocate shared memory of size

问题状态: zabbix_agentd不能启动,系统CentOS 5.8 i386 原因分析: 这是因为内核对share memory的限制造成的. 用到如下命令ipcs [-m|l|a],sysctl [-a|p] 1 [root@server01 ~]# ipcs -l <br /><br /><p></p><p>------ Shared Memory Limits --------<br />max number of seg

zabbix登陆问题:cannot allocate shared memory for collector

问题说明:在一台zabbix被监控服务器上(64位centos6.8系统,64G内容)启动zabbix_agent,发现进程无法启动,10050端口没有起来! 启动zabbix_agent进程没有报错,但10050端口没有正常启动起来.[[email protected] ~]# /usr/local/zabbix/sbin/zabbix_agentd[[email protected] ~]# ps -ef|grep zabbix_agentroot 27506 27360 0 11:07 p

docker cgroup 之memory(首篇)

测试环境centos7 ,内核版本4.20 内核使用cgroup对进程进行分组,并限制进程资源和对进程进行跟踪.内核通过名为cgroupfs类型的虚拟文件系统来提供cgroup功能接口.cgroup有如下2个概念: subsystem:用于控制cgroup中的进程行为的内核组件,可以在/proc/cgroups查看所有支持的subsystem,subsystem也别称为resource controller:第二列为croup id:第三列为cgroup中进程数目. # cat /proc/cg

进程通信之内存共享篇

进程通信之_ 内存共享 概念:共享内存是被多个进程共享的一部分物理内存.共享内存是进程间的共享数最快的方法,一个进程向共享内存区域写入数据,共享这个内存区域的所有进程就可以写入数据,所有进程就可以立刻看到其中的内容. 实现步骤;1.创建共享内存,使用shmget函数2.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数 创建:int shmget (key_t key,int size,int shmflg)key 标识内存功效的键值0/ipc_private.成功返回

淘宝开源Key/Value结构数据存储系统Tair技术剖析

摘要: Tair的功能 Tair是一个Key/Value结构数据的解决方案,它默认支持基于内存和文件的两种存储方式,分别和我们通常所说的缓存和持久化存储对应. Tair除了普通Key/Value系统提供的功能,比如get.put.delete以及批量接口外,还有一些附加的实用功能,使得其有更广的适用场景,包括: Version支持> 原子计数器 Item支持 Tair是由淘宝网自主开发的Key/Value结构数据存储系统,在淘宝网有着大规模的应用.您在登录淘宝.查看商品详情页面或者在淘江湖和好友

python多线程、多进程以及GIL

多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调用start()方法,即开始运行该线程,该线程将执行函数func,当然,如果func需要参数,可以在Thread的构造函数中传入参数args=(-).示例代码如下 import threading #用于线程执行的函数 def counter(n): cnt = 0; for i in xrange

[Linux内核]软中断、tasklet、工作队列

转自:http://www.cnblogs.com/li-hao/archive/2012/01/12/2321084.html 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的"下半部"(bottom half)演变而来.下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者.本文重点在于介绍这三者之间的关系.(函数细节将不会在本文中出现,可以参考文献,点这里) 1. 上半部和下半部的区别 上半部