`
icarusliu
  • 浏览: 237139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

System V共享内存使用实例

阅读更多
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/errno.h>
#include <pthread.h>
#include <string.h>
#include <malloc.h>
#include <signal.h>

#define BUFFER_SIZE 1000

typedef struct SHMSTRU
{
	pthread_mutex_t lock;
	char buffer[BUFFER_SIZE];
}ShmStru;

typedef enum
{
	false,
	true
}bool;

void signalCancel(int);

bool isExit = false;

int main(void)
{
	int key = 1000;
	int shmid = 0;	
	ShmStru *pShmStru = NULL;
	int exist = 0;
	int cPid = 0;
	int ret = 0;

	struct shmid_ds shmDs;

	signal(SIGINT, signalCancel);

	shmid = shmget(key, sizeof(ShmStru), IPC_EXCL | IPC_CREAT);
	if (-1 == shmid)
	{
		if (EEXIST == errno)
		{
			printf("INFO: The shared memory is exist!\n");
			shmid = shmget(key, 0, 0);
			exist = 1;
		}
		else
		{
			printf("ERROR: Create shared memory failed, ErrorCode: %d!\n", errno);
			return -1;
		}
	}

	memset(&shmDs,0x00, sizeof(struct shmid_ds));
	
	//Get the info of the shared memory
	if (exist)
	{
		ret = shmctl(shmid, IPC_STAT, &shmDs);
		if (-1 != ret)
		{
			printf("INFO: The current attache processes num: %d!\n", (int)shmDs.shm_nattch);
		}
	}	

	pShmStru = (ShmStru *)shmat(shmid, 0, 0);
	if ((void *)-1 == pShmStru)
	{
		perror("");
		return -1;
	}	

	if (!exist)
	{
		strcpy(pShmStru->buffer, "The initial information!");
		pthread_mutex_init(&pShmStru->lock, 0);
	}

	cPid = fork();
	if (0 == cPid)
	{
		while (!isExit)
		{
			pthread_mutex_lock(&pShmStru->lock);
			printf("Child: The info in shared memory is %s!\n", pShmStru->buffer);
			strcpy(pShmStru->buffer, "The information set by the child!");	
			pthread_mutex_unlock(&pShmStru->lock);
			usleep(1000000);
		}
		shmdt(pShmStru);
	}
	else
	{
		while (!isExit)
		{
			pthread_mutex_lock(&pShmStru->lock);
			printf("Parent: The info in shared memory is %s!\n", pShmStru->buffer);
			strcpy(pShmStru->buffer, "The information set by the parent!");
			pthread_mutex_unlock(&pShmStru->lock);
			usleep(1000000);
		}
		shmdt(pShmStru);
		shmctl(shmid, IPC_RMID, 0);
	}
	
	return 1;
}

void signalCancel(int i)
{
	printf("INFO: Catch the cancel signal!\n");
	isExit = true;
}
 
分享到:
评论

相关推荐

    linux系统进程间通信——共享内存(System V版本)

    之前用过Prosix版本的共享内存和信号量,一直没有实践System V版本的,主要是因为其信号量集的概念操作有些复杂,今天试着写一个SV版本的共享内存进程间通信,使用信号量同步。程序提供了几个简单的用于操作SV版本...

    Codesys共享内存范例.7z

    在C#端,你需要使用如`System.Runtime.InteropServices`命名空间下的函数来操作内存,而在Codesys端,可以通过系统服务或库函数来创建和管理共享内存。 为了成功运行此范例,你需要确保Codesys环境为V3.15或更高...

    php进程(线程)通信基础之System V共享内存简单实例分析

    主要介绍了php进程(线程)通信基础之System V共享内存,结合简单实例形式分析了PHP System V共享内存原理、相关函数与基本使用技巧,需要的朋友可以参考下

    linux内存共享源代码

    在Linux系统中,可以使用System V IPC或POSIX共享内存接口来实现。 1. **System V IPC共享内存**:这是早期的Linux版本中常用的共享内存实现,通过`shmget`、`shmat`、`shmdt`和`shmctl`等系统调用来管理共享内存。...

    基于Linux的同步共享内存的研究与实现

    - **System V IPC**:包括消息队列、信号量和共享内存等机制。 - **POSIX IPC**:为新标准,提供与System V IPC相似的功能但更现代化。 - **套接字(Socket)**:适用于网络通信及本地进程间通信。 其中,**共享内存*...

    Oracle内存管理(深入解析)

    为了监控SGA的使用情况,DBA可以使用视图v$sgastat,同时,通过`ipcs -sa`命令可以查看操作系统层面的共享内存分配,`pmap`命令则可以展示进程的内存映射。了解这些工具和视图可以帮助DBA有效地管理和优化Oracle...

    UNIX网络编程 卷II(Part1)

    Posix和System V共享内存;Solaris门和Sun RPC;IPC技术的性能测量。 本书内容详尽且具有权威性,几乎每章都有精选的习题,是计算机和网络专业高年级本科生和研究生的首选教材,本书也可作为网络研究和开发人员的...

    UNIX网络编程 卷II(Part2)

    Posix和System V共享内存;Solaris门和Sun RPC;IPC技术的性能测量。 本书内容详尽且具有权威性,几乎每章都有精选的习题,是计算机和网络专业高年级本科生和研究生的首选教材,本书也可作为网络研究和开发人员的...

    UNIX网络编程卷二

    Posix和System V共享内存;Solaris门和Sun RPC;IPC技术的性能测量。 本书内容详尽且具权威性,几乎每章都有精选的习题,是计算机和网络专业高年级本科生和研究生的首选教材。本书也可作为网络研究和开发人员的自学...

    SHAllocator-开源

    SHAllocator 是一个开源的 C++ STL 分配器,它构建在 libmm 库之上,专为 SYSTEM V 共享内存设计。共享内存是一种高效的进程间通信(IPC)机制,允许多个进程访问同一块内存区域,从而实现数据的快速交换。在 C++ 中...

    进程通信示例

    在Linux中,可以使用`mmap()`系统调用来创建和映射共享内存段。为了同步访问,通常会结合信号量或者互斥锁(mutexes)等同步机制使用。 **使用共享内存的步骤**: 1. 创建共享内存段,分配内存空间。 2. 将进程的...

    oracle内存全面分析

    SGA是Oracle实例的核心组成部分之一,它是一个共享内存区域,包含数据和控制信息,旨在为多个并发用户或进程提供共享访问。SGA在实例启动时创建,在实例关闭时释放,确保每个实例拥有独立的内存空间,即使在多实例...

    oracle内存管理

    3. **自动共享内存管理(ASMM)**: 自动调整SGA中的各个组件大小。 4. **自动PGA内存管理(APMM)**: 动态调整PGA大小。 #### 四、示例分析 以下是一个启动Oracle数据库后的内存使用情况示例: ```sql SQL&gt; startup ...

    Oracleg标准体系结构V.docx

    * SGA(SYSTEM GLOBAL AREA)系统全局区:SGA是所有服务器进程共享的内存区域,用于存储数据库缓冲区、共享池、重做日志缓冲区等。 SGA(SYSTEM GLOBAL AREA)系统全局区 SGA系统全局区是Oracle标准体系结构V的核心...

    Oracle数据库系统内存优化探讨.pdf

    SQL脚本可以帮助监控和调整内存参数,例如,可以使用`V$SGA`和`V$PGA_AGGREGATE_TARGET`视图来查看SGA和PGA的当前状态,使用`ALTER SYSTEM SET`命令来修改内存参数。 总的来说,理解Oracle数据库的内存结构及其参数...

    oracle10g系统管理笔记 内存篇

    - **监控与诊断**:使用`V$视图`进行内存监控,如`V$SGA`、`V$PGA`、`V$SESSION`等,帮助识别和解决问题。 4. **常见问题与解决策略** - **内存泄漏**:某些情况下,进程可能无法正确释放内存。可以通过跟踪和分析...

Global site tag (gtag.js) - Google Analytics