Linux关于共享内存编程

要运行程序,需要在当前目录下建立一个share文件,share是一个空文件,没有任何意义,只是函数ftok需要一个文件名作参数,ftok另一个参数可以为任何数字。

程序运行后,分为父子进程,子进程申请共享内存,然后等待父进程继续执行,父进程首先等待子进程申请到共享内存标识,然后输出共享内存中的内容,为了演示共享内存可以随时更新,程序中在子进程里产生随机数写入共享内存供父进程读取。代码如下:

#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>

#include<time.h>#include<signal.h>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/types.h>

int shmID;char * buf;void finalize(int signo){shmctl(shmID,IPC_RMID,NULL);exit(0);}

int main(){int i = 1;key_t shmKey;signal(SIGINT,finalize);signal(SIGTERM,finalize);if(fork() == 0)//子进程{shmKey = ftok("share",16);//可以使用任何大于0的数字,如果名字和数相同,则产生的key相同。if(shmKey == -1){printf("创建key出错/n");exit(-1);}shmID = shmget(shmKey,20,IPC_CREAT | IPC_EXCL | 0666);if(shmID == -1){printf("创建共享标识出错/n");exit(-1);}sleep(2);//等待父进程执行,好显示第一行为空。while(1){buf = (char *)shmat(shmID,NULL,0);srandom(time(NULL));sprintf(buf,"%d",random());shmdt(buf);}}else//父进程{sleep(1);//让子进程先执行,以建立内存映射。shmKey = ftok("share",16);//可以使用任何大于0的数字,如果名字和数相同,则产生的key相同。if(shmKey == -1){printf("创建key出错/n");exit(-1);}shmID = shmget(shmKey,20,0);//0表示如果shmKey映射的不存在则报错。if(shmID == -1){printf("引用共享标识出错/n");exit(-1);}while(1){buf = (char *)shmat(shmID,NULL,0);printf("%d. 现在共享内存中的内容为:%s/n",i++,buf);shmdt(buf);sleep(1);}}

return 0;}

拿望远镜看别人,拿放大镜看自己。

Linux关于共享内存编程

相关文章:

你感兴趣的文章:

标签云: