进程间通信之: 共享内存
#include <sys/types.h>ys/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\n",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\n", shm_addr);
}
system("ipcs -m");
/* 通过检查在共享内存的头部是否标志字符串"WROTE"来确认
父进程已经向共享内存写入有效数据 */
while (strncmp(shm_addr, flag, strlen(flag)))
{
printf("Child: Wait for enable data...\n");
sleep(5);
}
/* 获取共享内存的有效数据并显示 */
strcpy(buff, shm_addr + strlen(flag));
printf("Child: Shared-memory :%s\n", buff);
/* 解除共享内存映射 */
if ((shmdt(shm_addr)) < 0)
{
perror("shmdt");
exit(1);
}
else
{
printf("Child: Deattach shared-memory\n");
}
system("ipcs -m");
/* 删除共享内存 */
if (shmctl(shmid, IPC_RMID, NULL) == -1)
{
perror("Child: shmctl(IPC_RMID)\n");
exit(1);
}
else
{
printf("Delete shared-memory\n");
}
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\n", shm_addr);
}
sleep(1);
printf("\nInput some string:\n");
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("Parent: shmdt");
exit(1);
}
else
{
printf("Parent: Deattach shared-memory\n");
}
system("ipcs -m");
waitpid(pid, NULL, 0);
printf("Finished\n");
}
exit(0);
}
下面是运行结果。从该结果可以看出,nattch的值随着共享内存状态的变化而变化,共享内存的值根据不同的系统会有所不同。
$ ./shmem
Create shared-memory: 753665
/* 在刚创建共享内存时(尚未有任何地址映射)共享内存的情况 */
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 753665 david 666 2048 0
Child: Attach shared-memory: 0xb7f59000 /* 共享内存的映射地址 */
Parent: Attach shared-memory: 0xb7f59000
/* 在父子进程中进行共享内存的地址映射之后共享内存的情况*/
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 753665 david 666 2048 2
Child: Wait for enable data...
Input some string:
Hello /* 用户输入字符串"Hello" */
Parent: Deattach shared-memory
/* 在父进程中解除共享内存的映射关系之后共享内存的情况 */
------ Shared Memory Segments --------
key
- 进程间通信之:实验内容(08-13)
- 进程间通信之: 信号量(08-13)
- 《嵌入式Linux应用程序开发标准教程》(第2版)(09-30)
- 进程间通信之:消息队列(09-13)
- 进程间通信之:本章小结及思考与练习(09-13)
- 基于嵌入式Linux的移动机器人控制系统(09-09)