当前位置: 技术问答>linux和unix
进程间怎样共享内存?
来源: 互联网 发布时间:2015-04-15
本文导语: 我在linux建立一个程序服务器,为了提高效率,我想采用多进程,一个进程用于接收别的程序传输来的数据,另外一个进程用来读取这些数据.这样两个进程通过共享内存实现通讯.哪位能给我一个这样的例子,既建立了两个进...
我在linux建立一个程序服务器,为了提高效率,我想采用多进程,一个进程用于接收别的程序传输来的数据,另外一个进程用来读取这些数据.这样两个进程通过共享内存实现通讯.哪位能给我一个这样的例子,既建立了两个进程,两个进程间又是通过共享内存实现通讯的.我的邮箱是:breaveheart@tom.com.
先谢谢了!(如果有window环境下,一起发给我就更好了!)
先谢谢了!(如果有window环境下,一起发给我就更好了!)
|
你为什么要用多进程呢?用多线程不行吗?多个线程共享同一个地址空间,只要进行一些必要的同步处理应该就能搞定。
|
//给你一个例子,分配20M共享内存。
//主线程往内存中写数据,thread_proc从共享内存中毒数据
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SHM_SIZE (20 * 1024 * 1024) // 20M
static key_t SHM_KEY = 12345;
static int shm_id = -1;
static int running = 1;
void * thread_proc(void *p)
{
char *buf;
int shmid = shmget(SHM_KEY, SHM_SIZE, 0666);
if (shm_id == -1)
{
perror("get share memory");
return NULL;
}
buf = (char *)shmat(shmid, NULL, 0);
while(running)
{
sleep(1);
printf("%sn", buf);
}
return 0;
}
void exit_do()
{
if (shm_id != -1)
{
if (shmctl(shm_id, IPC_RMID, 0) == -1)
{
perror("delete share memory");
}
}
}
void sig_do(int sig)
{
running = 0;
exit(0);
}
int main()
{
pthread_t pid;
char *buf;
int i = 0;
atexit(exit_do);
signal(SIGINT, sig_do);
shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT|0666);
if (shm_id == -1)
{
perror("create share memory");
return -1;
}
buf = shmat(shm_id, NULL, 0);
pthread_create(&pid, NULL, thread_proc, NULL);
while(1)
{
sprintf(buf, "This is a test! times: %d", i++);
sleep(1);
}
return 0;
}
//主线程往内存中写数据,thread_proc从共享内存中毒数据
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SHM_SIZE (20 * 1024 * 1024) // 20M
static key_t SHM_KEY = 12345;
static int shm_id = -1;
static int running = 1;
void * thread_proc(void *p)
{
char *buf;
int shmid = shmget(SHM_KEY, SHM_SIZE, 0666);
if (shm_id == -1)
{
perror("get share memory");
return NULL;
}
buf = (char *)shmat(shmid, NULL, 0);
while(running)
{
sleep(1);
printf("%sn", buf);
}
return 0;
}
void exit_do()
{
if (shm_id != -1)
{
if (shmctl(shm_id, IPC_RMID, 0) == -1)
{
perror("delete share memory");
}
}
}
void sig_do(int sig)
{
running = 0;
exit(0);
}
int main()
{
pthread_t pid;
char *buf;
int i = 0;
atexit(exit_do);
signal(SIGINT, sig_do);
shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT|0666);
if (shm_id == -1)
{
perror("create share memory");
return -1;
}
buf = shmat(shm_id, NULL, 0);
pthread_create(&pid, NULL, thread_proc, NULL);
while(1)
{
sprintf(buf, "This is a test! times: %d", i++);
sleep(1);
}
return 0;
}
|
http://joyfire.net/jln/system/11.html
希望对你有用
希望对你有用
|
shmget,shmat.