sharmemory.c(linux下的共享内存使用实例)

/*
 *Filename: sharmemry.c
 *Description: 利用fork函数创建子进程后,父进程先等待子进程中用户输入字符串写入共享内存,之后在共享内存尾部写入end。
父进程随后将共享内存的信息打印在终端上。
 */


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>


#define BUFFERSIZE 1024


int main()
{
int shmid;
pid_t pid;
void *shmadress;
char buf[BUFFERSIZE];


//创建共享内存
shmid = shmget((key_t)1234,BUFFERSIZE,0666 | IPC_CREAT); 
if(shmid == -1)
{
perror("shmget error");
exit(-1);
}
else
{
printf("sharmemory shmid = %d\n",shmid);
}


//创建子进程
pid = fork();
if(pid == -1)
{
perror("fork error");
exit(-1);
}
else if(pid == 0) // 进入子进程
{
//映射共享内存
shmadress = shmat(shmid,NULL,0);
if(shmadress == (void *)-1)
{
perror("in child process,shamt error");
exit(-1);
}

//子进程中,向共享内存写入数据
printf("input:");
fgets(buf,BUFFERSIZE,stdin);
//写入共享内存,并在末尾添加end
strncpy(shmadress,buf,strlen(buf));
strncpy(shmadress+strlen(buf)-1,"end",3);

//解除共享映射内存
if(shmdt(shmadress) < 0)
{
perror("in chid process,shmdt error");
exit(-1);
}
}
else //进入父进程
{
//等待子进程完成
wait(NULL);
shmadress = shmat(shmid,NULL,0);
if(shmadress == (void *)-1)
{
perror("in parent process,shmat error");
exit(-1);
}

strcpy(buf,shmadress);
printf("The message is: %s\n",buf);

//解除共享内存的映射
if(shmdt(shmadress) < 0)
{
perror("in parent process,shmdt error");
exit(-1);
}

//删除共享内存
if(shmctl(shmid,IPC_RMID,NULL) < 0)
{
printf("in parent process,shmctl error");
exit(-1);
}
}

exit(0);

}




结果:


发布了61 篇原创文章 · 获赞 6 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/shayueqing/article/details/11797429