共享内存:
共享存储允许两个或更多进程共享一给定的存储区。若服务器正在将数据放入共享存储区,则在它做完这一操作之前,客户进程不应当去取这些数据。通常,信号量被用来实现对共享存储访问的同步。
为获得一个共享存储段,调用的第一个函数通常是shmget。
int shmget(key_t
类似于msgget();成功返回共享存储段标识符;出错返回-1。
flag用来设置权限,如:flag=IPC_CREAT|IPC_EXCL|0777。
int
类似于msgctl();
用shmctl(shmid,IPC_RMID,0)从系统中删除共享存储段;
一旦创建了一个共享存储段,进程就可以调用shmat()将共享存储段连接到进程的地址空间中。
void
成功则返回指向共享存储的指针,若出错则返回-1.
shmat的返回值是该段所连接的实际地址,如果出错则返回-1.
共享存储段连接到调用进程的哪个地址上与addr参数以及在flag中是否指定SHM_RND位有关。
如果addr为0,则此段连接到由内核选择的第一个可用地址上。这是推荐的使用方式。
如果addr非0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上。
如果addr非0,并且指定了SHM_RND,则此段连接到(addr-(addr
除非只计划在一种硬件上运行应用程序(这在当今不大可能),否则不应指定共享段所连接到的地址。所以一般指定addr为0,以便由内核选择地址。
如果在flag中指定了SHM_RDONLY位,则以只读方式连接此段,否则以读写方式连接此段。
当对共享存储段的操作已经结束时,则调用shmdt脱离该段。注意,这并不从系统中删除其标识符以及数据结构,只是使用共享存储段所需要遵守的规则。
int shmdt(const void *shmaddr);
成功返回0,出错返回-1.
shm_rw.c ==> 讲解共享存储段的使用方法。
方法:
父进程向共享存储段里放置一个数据,放好了以后给子进程发送SIGUSR1信号让子进程从共享存储段里拿出来。
shm_rw.c
#include
int main()
{
}