您的位置:首页 > 编程语言

系统编程之进程通信 共享内存

2012-10-16 09:46 211 查看
/*shm_com.h*/

#define
TEXT_SZ2048

structshared_use_st

{

intwritten_by_you;//互斥控制有读写两进程改写(1读进程0写进程)

charsome_text[TEXT_SZ];//数据部分

};


/*shm1.c*/

/*读进程
*/
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include"shm_com.h"
intmain(void)
{
intrunning=1;
void*shared_memory=(void*)0;
structshared_use_st*shared_stuff;
intshmid;
/*创建共享内存*/
shmid=shmget((key_t)1234,sizeof(structshared_use_st),0666|IPC_CREAT);
if(shmid==-1)
{
fprintf(stderr,"shmgetfailed\n");
exit(EXIT_FAILURE);
}
/*映射(附加)共享内存*/
shared_memory=shmat(shmid,(void*)0,0);
if(shared_memory==(void*)-1)
{
fprintf(stderr,"shmatfailed\n");
exit(EXIT_FAILURE);
}
printf("Memoryattachedat%X\n",(int)shared_memory);
/*让结构体指针指向这块共享内存*/
shared_stuff=(structshared_use_st*)shared_memory;
/*控制读写顺序*/
shared_stuff->written_by_you=0;
/*循环的从共享内存中读数据,直到读到“end”为止*/
while(running)
{
if(shared_stuff->written_by_you)
{
printf("Youwrote:%s",shared_stuff->some_text);
sleep(1);/*读进程睡一秒,同时会导致写进程睡一秒(信号量为1),这样做到了读了之后再写*/
shared_stuff->written_by_you=0;
if(strncmp(shared_stuff->some_text,"end",3)==0)
{
running=0;//结束循环
}
}
}
/*分离共享内存*/
if(shmdt(shared_memory)==-1)
{
fprintf(stderr,"shmdtfailed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
/*shm2.c*/
/*写进程*/
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include"shm_com.h"
intmain()
{
intrunning=1;
void*shared_memory=(void*)0;
structshared_use_st*shared_stuff;
charbuffer[BUFSIZ];
intshmid;
/*创建共享内存*/
shmid=shmget((key_t)1234,sizeof(structshared_use_st),0666|IPC_CREAT);
if(shmid==-1)
{
fprintf(stderr,"shmgetfailed\n");
exit(EXIT_FAILURE);
}
/*映射(附加)共享内存*/
shared_memory=shmat(shmid,(void*)0,0);
if(shared_memory==(void*)-1)
{
fprintf(stderr,"shmatfailed\n");
exit(EXIT_FAILURE);
}
printf("Memoryattachedat%X\n",(int)shared_memory);
/*让结构体指针指向这块共享内存*/
shared_stuff=(structshared_use_st*)shared_memory;
/*循环的向共享内存中写数据。直到写入的为“end”为止*/
while(running)
{
while(shared_stuff->written_by_you==1)
{
sleep(1);//等到读进程读完之后再写
printf("waittingforclient..\n");
}
printf("Entersometst:");
fgets(buffer,BUFSIZ,stdin);
strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
shared_stuff->written_by_you=1;
if(strncmp(buffer,"end",3)==0)
{
running=0;//结束循环
}
}
/*分离共享内存*/
if(shmdt(shared_memory)==-1)
{
fprintf(stderr,"shmdtfailed\n");
exit(EXIT_FAILURE);
}
/*删除共享内存*/
if(shmctl(shmid,IPC_RMID,0)<0)//等到所有已附加进程都分离才删除
{
fprintf(stderr,"shmctlerror\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: