1月 102016

共享内存是linux进程间通信的一种方式,实现多进程共享变量。应用共享内存时,主要涉及shmget、shmat、shmdt、shmctl四个函数。
此外,可通过ipcs -m来查看linux共享内存使用情况。
下面展示一个本人编写的一应用实例。
/**
* \File test_shm.c
*
* COPYRIGHT (C) 2016 http://velep.com/
*
* \brief linux共享内存测试程序
* 使用共享内存,实现多进程共享变量
*
* \version: Ver1.0
* \Date : 2016.01.10
* \Decrip : 原始版本
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
// 基本类型定义
#define true 1
#define false 0
typedef unsigned char bool;
typedef unsigned char byte;
typedef unsigned char __u8;
typedef unsigned int __u32;
// 共享内存数据结构
typedef struct struct_context
{
__u8 data;
} context_t;
// 全局变量定义
static bool run = true;
context_t *g_pcontext = NULL;
// ----------------------------------------------------------------------------
void delay_ms(const __u32 ms)
{
struct timespec tv;
tv.tv_sec = ms / 1000;
tv.tv_nsec = (long)(ms % 1000) * 1000000;
nanosleep(&tv, NULL);
}
// 信号处理
void sig_handler(int signo)
{
switch(signo)
{
case SIGINT:
run = false;
printf(".Exit\n");
break;
default: break;
}
}
// 安装信号
void install_sig(void)
{
signal(SIGINT, sig_handler);
}
int main(int argc, char **argv)
{
pid_t pid = -1;
int shmid;// id for shared memory
int status = 0;
// 创建一个新的共享内存对象
shmid = shmget(IPC_PRIVATE, sizeof(context_t), S_IRUSR | S_IWUSR);
// 映射共享内存
g_pcontext = (context_t *)shmat(shmid, NULL, 0);
if (g_pcontext == NULL)
{
printf("\n\t创建共享内存失败\n\n");
return -1;
}
memset(g_pcontext, 0x00, sizeof(*g_pcontext));
printf("\n创建共享内存: shmid [%d], size [%d]\n",
shmid, sizeof(context_t));
// 显示共享内存的情况
system("ipcs -m");
run = true;
pid = fork();
if (pid == -1)
{
printf("\n\t创建进程失败\n\n");
run = false;
}
else if (pid == 0) // 子进程
{
while (run)
{
if (g_pcontext->data >= 3)
{
delay_ms(1000);
g_pcontext->data++;
printf("子进程,data [%u]\n", g_pcontext->data);
if (g_pcontext->data >= 6)
{
break;
}
continue;
}
delay_ms(10);
}
}
else // 父进程
{
install_sig();
while (run)
{
g_pcontext->data++;
printf("父进程,data [%u]\n", g_pcontext->data);
if (g_pcontext->data >= 3)
{
break;
}
delay_ms(1000);
}
// 等待子进程退出
while(((pid = wait(&status)) == -1) && (errno == EINTR))
{
delay_ms(10);
}
}
shmdt(g_pcontext);// 解除共享内存映射
shmctl(shmid, IPC_RMID, NULL);// 释放共享内存
// 显示共享内存的情况
system("ipcs -m");
return 0;
}
» 文章出处:
reille博客—http://velep.com
, 如果没有特别声明,文章均为reille博客原创作品
» 郑重声明:
原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)
推荐阅读相关文章:
- terminate called after throwing an instance of ‘std::length_error’ what(): basic_string::_S_create
- 编译错误:error: stray ‘\357’ in program
- LINUX socket can的bit-timing not yet defined错误
- Linux CAN编程详解
- linux socket can程序cantool
- TCP Server处理多Client请求的方法—非阻塞accept与select
- 联想E430C和WINDOW 7
- undefined reference to `_WinMain@16’问题

