您的位置:首页 > 其它

Unix IPC之基于共享内存的计数器

2015-08-18 14:50 585 查看
目的
本文主要实现一个基于共享内存的计数器,通过父子进程对其访问。

本文程序需基于<<Unix网络编程-卷2>>的环境才能运行。程序中大写开头的函数为其小写同名函数的包裹函数,增加了错误处理信息。

1 函数介绍

2 计数器——非共享内存
默认情况下,通过fork派生的子进程并不与其父进程共享内存区。

由于子进程为父进程的拷贝,所以子进程自己有一个count的副本,所以父子进程操作自己的count。这里使用一个有名信号量来同步父子进程。

3 计数器——共享内存
程序说明:

#include    "unpipc.h"

struct shmstruct    /* struct stored in shared memory */
{
int   count;
};
sem_t   *mutex;     /* pointer to named semaphore */

int
main(int argc, char **argv)
{
int     fd, i, nloop;
pid_t   pid;
struct shmstruct    *ptr; // 注意这里的指针类型

if (argc != 4)
err_quit("usage: client1 <shmname> <semname> <#loops>");
nloop = atoi(argv[3]);

fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR, FILE_MODE);
ptr = Mmap(NULL, sizeof(struct shmstruct), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
Close(fd);

mutex = Sem_open(Px_ipc_name(argv[2]), 0);

pid = getpid();
for (i = 0; i < nloop; i++)
{
Sem_wait(mutex);
printf("pid %ld: %d\n", (long) pid, ptr->count++);
Sem_post(mutex);
}
exit(0);
}


View Code

说明:服务器运行一个实例;客户端运行多个实例,实例之间互斥对计数器进行+1操作;

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