共享内存:共享内存中的内容是在解除映射时才写回文件
Sample code
用共享内存实现了线程间的semphore
#include<stdio.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
#include <semaphore.h>
int sharememory(int ipc_size,int flag);
int create_ipc(int ipc_size);
int get_ipc(int ipc_size);
int destroy_sharememory(int id);
int main()
{
int i = 0;
int id = 0;
char* p = NULL;
pid_t pid;
/* セマフォの初期化 */
sem_t s1;
sem_init (&s1, 1, 0);
id = create_ipc(sizeof(sem_t));
printf("id = %d\n",id);
if(id < 0)
{
printf("エラー:共有メモリ创建失敗\n");
}
id = 0;
id = get_ipc(sizeof(sem_t));
if(id < 0){
printf("エラー:共有メモリ取得失敗\n");
}else{
p = shmat(id,NULL,0); // 获取可用共享内存空间的首地址
if(p < 0)
{
printf("エラー:共有メモリ アドレスの取得失敗\n");
p = NULL;
}
memcpy(p, &s1, sizeof(sem_t));
if(shmdt(p) == -1) // 不需要对此共享内存进行操作
{
printf("エラー:共有メモリの削除失敗\n");
}
/* 子プロセスの作成 */
if ((pid = fork()) >= 0){
/* 父プロセス */
if (pid > 0) {
printf("------------------\n");
printf("Aプロセスの実行 ");
printf("%d:\n", getpid());
p = shmat(id,NULL,0); // 获取可用共享内存空间的首地址
if(p < 0)
{
printf("エラー:共有メモリ アドレスの取得失敗\n");
p = NULL;
}
printf("sem -1\n");
sem_wait(p);
if(shmdt(p) == -1) // 不需要对此共享内存进行操作
{
printf("エラー:共有メモリの削除失敗\n");
}
printf("Aプロセスの実行 ");
printf("%d:\n", getpid());
sleep(5);
if(destroy_sharememory(id)<0){
printf("エラー:共有メモリの破棄失敗\n");
}else {
printf("共有メモリの破棄\n");
}
/* 子プロセス */
}else {
printf("------------------\n");
printf("Bプロセスの実行 ");
printf("%d:\n", getpid());
p = shmat(id,NULL,0);
if(p < 0)
{
printf("エラー:共有メモリ アドレスの取得失敗\n");
p = NULL;
}
sem_post(p);
printf("sem +1\n");
if(shmdt(p) == -1){
printf("エラー:共有メモリの削除失敗\n");
}
id = 0;
printf("------------------\n");
}
}
}
}
int sharememory(int ipc_size,int flag)
{
int id;
key_t key=ftok("/home/hzfuji/eclipse-workspace/test_memory",28);
if(key < 0)
{
printf("get key error\n");
return -1;
}
id = shmget(key,ipc_size,flag);
if(id < 0)
{
printf("get id error\n");
return -1;
}
return id;
}
int create_ipc(int ipc_size)
{
return sharememory(ipc_size,IPC_CREAT|0666);
}
int get_ipc(int ipc_size)
{
return sharememory(ipc_size,IPC_CREAT|0666);
}
int destroy_sharememory(int id)
{
return shmctl(id,IPC_RMID,NULL);
}