当前位置: 技术问答>linux和unix
关于共享内存的进程间通信问题【求助】
来源: 互联网 发布时间:2016-05-28
本文导语: 我想通过共享内存实现进程间的通信,我看了下书上的例子,一个读程序,一个写程序。以写程序为例:#include "sharemem.h" #define SHM_SIZE 1024 int main() { int semid, shmid; char *shmaddr; char write_str[SHM_SIZE]; if (...
我想通过共享内存实现进程间的通信,我看了下书上的例子,一个读程序,一个写程序。以写程序为例:#include "sharemem.h"
#define SHM_SIZE 1024
int main()
{
int semid, shmid;
char *shmaddr;
char write_str[SHM_SIZE];
if ((shmid = createshm (".", 'm', SHM_SIZE)) == -1)
{
exit(1);
}
if ((shmaddr = shmat (shmid, (char *)0, 0)) ==(char *)-1)
{
perror ("attach shared memory error!n");
exit (1);
}
if ((semid = createsem (".", 's', 1, 1)) == -1)
{
exit (1);
}
while (1)
{
wait_sem (semid, 0);
sem_p (semid, 0); /*P操作*/
printf ("writer: ");
fgets (write_str, 1024, stdin);
int len = strlen (write_str) - 1;
write_str[len] = '';
strcpy (shmaddr, write_str);
sleep (10); /*使reader处于阻塞状态*/
sem_v (semid, 0); /*V操作*/
sleep (10); /*等待reader进行读操作*/
}
}
通过上面的代码可以实现共享内存的读写,但是每次写入数据都会把之前的数据覆盖,那如果我要分多次写入几组数据然后再读出来的话该怎样实现呢?共享内存的方式能实现这个功能吗?望高手指点。
#define SHM_SIZE 1024
int main()
{
int semid, shmid;
char *shmaddr;
char write_str[SHM_SIZE];
if ((shmid = createshm (".", 'm', SHM_SIZE)) == -1)
{
exit(1);
}
if ((shmaddr = shmat (shmid, (char *)0, 0)) ==(char *)-1)
{
perror ("attach shared memory error!n");
exit (1);
}
if ((semid = createsem (".", 's', 1, 1)) == -1)
{
exit (1);
}
while (1)
{
wait_sem (semid, 0);
sem_p (semid, 0); /*P操作*/
printf ("writer: ");
fgets (write_str, 1024, stdin);
int len = strlen (write_str) - 1;
write_str[len] = '';
strcpy (shmaddr, write_str);
sleep (10); /*使reader处于阻塞状态*/
sem_v (semid, 0); /*V操作*/
sleep (10); /*等待reader进行读操作*/
}
}
通过上面的代码可以实现共享内存的读写,但是每次写入数据都会把之前的数据覆盖,那如果我要分多次写入几组数据然后再读出来的话该怎样实现呢?共享内存的方式能实现这个功能吗?望高手指点。
|
如果新内容已经覆盖了原来的内容,那么肯定没法讲原来内容读出来了。共享内存本身貌似无法实现这个功能。不过,你可以在每个进程建立自己的私有缓存,缓存共享内存读写的内容。毕竟,共享内存只是提供一种快速的进程间通信机制而已!
|
覆盖应该是因为你在同一个地址写了不同内容,你是否可以考虑多次写时使用首地址的偏移量来做偏移?
|
楼主忘记了不是,C和C++是两种语言,语言特性是不一样的,虽然C++兼容了很多C的特性。
|
把(char*)去掉试试。或者改为(void*)
|
shmaddr = shmat (shmid, (char *)0, 0)-->改成
shmaddr = shmat (shmid,NULL, 0))就可以了
shmaddr = shmat (shmid,NULL, 0))就可以了
|
strcpy (shmaddr, write_str);
一次写完后没有对内存偏移量做修改,可以这样写strcpy(shmaddr+偏移量,write_str),其实共享内存和程序内存的使用方法是一样的
一次写完后没有对内存偏移量做修改,可以这样写strcpy(shmaddr+偏移量,write_str),其实共享内存和程序内存的使用方法是一样的
|
对共享内存加锁,在第一次写进去的未读走之前不允许再写入,这样就好了。