共有メモリの作成とマッピングshmget()とshmat()
2891 ワード
共有メモリの実装には、次の2つのステップがあります.
1、共有メモリを作成し、使用する関数はshmget()である.
2、共有メモリをマッピングすることは、このセグメントで作成した共有メモリを具体的なプロセス空間にマッピングすることであり、使用する関数はshmat()である.
これにより、バッファを付けないI/O読み書きコマンドを使用して操作することができます.
例は次のとおりです.
デバッグを実行するときに発生します.スタックエラーは、読者がコードをよく読んで修正し、エラーを見つけて、下に添付してください.
1、共有メモリを作成し、使用する関数はshmget()である.
2、共有メモリをマッピングすることは、このセグメントで作成した共有メモリを具体的なプロセス空間にマッピングすることであり、使用する関数はshmat()である.
これにより、バッファを付けないI/O読み書きコマンドを使用して操作することができます.
例は次のとおりです.
/*
* shmem.c
*
* Created on: 2012-7-20
* Author: liwei.cai
*/
/**
* : 。
* : , ,
* 。
* , ,
* “WROTE” 。
* “WROTE”,
* , 。
* 。
*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 2048
int main()
{
pid_t pid;
int shmid;
char *shm_addr;
char flag[] = "WROTE";
char *buff;
//
if ((shmid = shmget(IPC_PRIVATE, BUFFER_SIZE, 0666)) < 0)
{
perror("shmget");
exit(1);
}
else
{
printf("Create shared-memory: %d
", shmid);
}
//
system("ipcs -m");
pid = fork();
if (pid == -1)
{
perror("fork");
exit(1);
}
else if (pid == 0) //
{
//
if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1)
{
perror("Child: shmat");
exit(1);
}
else
{
printf("Child:Attach shared-memory: %p
", shm_addr);
}
system("ipcs -m");
// “WROTE”
//
while(strncmp(shm_addr, flag, strlen(flag)))
{
printf("Child: wait for enable data...
");
sleep(5);
}
//
strcpy(buff, shm_addr + strlen(flag));
printf("Child: Shared-memory: %s
", buff);
//
if((shmdt(shm_addr)) < 0)
{
perror("shmdt");
exit(1);
}
else
{
printf("Child: Deattach shared-memory
");
}
system("ipcs -m");
//
if(shmctl(shmid, IPC_RMID, NULL) == -1)
{
perror("Child: shmctl(IPC_RMID)
");
exit(1);
}
else
{
printf("Delete shared-memory
");
}
system("ipcs -m");
}
else //
{
//
if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1)
{
perror("Parent: shmat");
exit(1);
}
else
{
printf("Parent:Attach shared-memory: %p
", shm_addr);
}
sleep(1);
printf("
Input some string:
");
fgets(buff, BUFFER_SIZE,stdin);
strncpy(shm_addr + strlen(flag), buff, strlen(buff));
strncpy(shm_addr, flag, strlen(flag));
//
if((shmdt(shm_addr)) < 0)
{
perror("shmdt");
exit(1);
}
else
{
printf("Parent: Deattach shared-memory
");
}
system("ipcs -m");
waitpid(pid, NULL, 0);
printf("Finished
");
}
exit(0);
}
デバッグを実行するときに発生します.スタックエラーは、読者がコードをよく読んで修正し、エラーを見つけて、下に添付してください.