#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;
}
分享到:
相关推荐
之前用过Prosix版本的共享内存和信号量,一直没有实践System V版本的,主要是因为其信号量集的概念操作有些复杂,今天试着写一个SV版本的共享内存进程间通信,使用信号量同步。程序提供了几个简单的用于操作SV版本...
在C#端,你需要使用如`System.Runtime.InteropServices`命名空间下的函数来操作内存,而在Codesys端,可以通过系统服务或库函数来创建和管理共享内存。 为了成功运行此范例,你需要确保Codesys环境为V3.15或更高...
主要介绍了php进程(线程)通信基础之System V共享内存,结合简单实例形式分析了PHP System V共享内存原理、相关函数与基本使用技巧,需要的朋友可以参考下
在Linux系统中,可以使用System V IPC或POSIX共享内存接口来实现。 1. **System V IPC共享内存**:这是早期的Linux版本中常用的共享内存实现,通过`shmget`、`shmat`、`shmdt`和`shmctl`等系统调用来管理共享内存。...
- **System V IPC**:包括消息队列、信号量和共享内存等机制。 - **POSIX IPC**:为新标准,提供与System V IPC相似的功能但更现代化。 - **套接字(Socket)**:适用于网络通信及本地进程间通信。 其中,**共享内存*...
为了监控SGA的使用情况,DBA可以使用视图v$sgastat,同时,通过`ipcs -sa`命令可以查看操作系统层面的共享内存分配,`pmap`命令则可以展示进程的内存映射。了解这些工具和视图可以帮助DBA有效地管理和优化Oracle...
Posix和System V共享内存;Solaris门和Sun RPC;IPC技术的性能测量。 本书内容详尽且具有权威性,几乎每章都有精选的习题,是计算机和网络专业高年级本科生和研究生的首选教材,本书也可作为网络研究和开发人员的...
Posix和System V共享内存;Solaris门和Sun RPC;IPC技术的性能测量。 本书内容详尽且具有权威性,几乎每章都有精选的习题,是计算机和网络专业高年级本科生和研究生的首选教材,本书也可作为网络研究和开发人员的...
Posix和System V共享内存;Solaris门和Sun RPC;IPC技术的性能测量。 本书内容详尽且具权威性,几乎每章都有精选的习题,是计算机和网络专业高年级本科生和研究生的首选教材。本书也可作为网络研究和开发人员的自学...
SHAllocator 是一个开源的 C++ STL 分配器,它构建在 libmm 库之上,专为 SYSTEM V 共享内存设计。共享内存是一种高效的进程间通信(IPC)机制,允许多个进程访问同一块内存区域,从而实现数据的快速交换。在 C++ 中...
在Linux中,可以使用`mmap()`系统调用来创建和映射共享内存段。为了同步访问,通常会结合信号量或者互斥锁(mutexes)等同步机制使用。 **使用共享内存的步骤**: 1. 创建共享内存段,分配内存空间。 2. 将进程的...
SGA是Oracle实例的核心组成部分之一,它是一个共享内存区域,包含数据和控制信息,旨在为多个并发用户或进程提供共享访问。SGA在实例启动时创建,在实例关闭时释放,确保每个实例拥有独立的内存空间,即使在多实例...
3. **自动共享内存管理(ASMM)**: 自动调整SGA中的各个组件大小。 4. **自动PGA内存管理(APMM)**: 动态调整PGA大小。 #### 四、示例分析 以下是一个启动Oracle数据库后的内存使用情况示例: ```sql SQL> startup ...
* SGA(SYSTEM GLOBAL AREA)系统全局区:SGA是所有服务器进程共享的内存区域,用于存储数据库缓冲区、共享池、重做日志缓冲区等。 SGA(SYSTEM GLOBAL AREA)系统全局区 SGA系统全局区是Oracle标准体系结构V的核心...
SQL脚本可以帮助监控和调整内存参数,例如,可以使用`V$SGA`和`V$PGA_AGGREGATE_TARGET`视图来查看SGA和PGA的当前状态,使用`ALTER SYSTEM SET`命令来修改内存参数。 总的来说,理解Oracle数据库的内存结构及其参数...
- **监控与诊断**:使用`V$视图`进行内存监控,如`V$SGA`、`V$PGA`、`V$SESSION`等,帮助识别和解决问题。 4. **常见问题与解决策略** - **内存泄漏**:某些情况下,进程可能无法正确释放内存。可以通过跟踪和分析...