linux 共享内存--System V共享内存

1)用ftok()函数得到一个ID号. 应用说明: 在IPC中,咱们常常用用key_t的值来建立或者打开信号量,共享内存和消息队列。这个在IPC的环境中十分的重要,好比说,服务器建立了一个消息队列,等待客户机发送请求。那么如何建立或者打开已有的消息队列呢?通常而言,咱们对于服务器使用的路径和项目id(proj_id)是已知的,因此客户机能够获取相同的key来打开 消息队列并进行操做。 函数原型: # include <sys/types.h> # include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id); Keys: 1)pathname必定要在系统中存在 2)pathname必定是使用进程可以访问的 3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。 当成功执行的时候,一个key_t值将会被返回,不然-1被返回。咱们可使用errno来肯定具体的错误信息若是咱们很懒惰的话,不妨就使用perror函数来打印对应的出错字符信息。 2)shmget()用来开辟/指向一块共享内存的函数 应用说明: shmget()用来得到共享内存区域的ID,若是不存在指定的共享区域就建立相应的区域。 函数原型: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); key_t key 是这块共享内存的标识符。若是是父子关系的进程间通讯的话,这个标识符用IPC_PRIVATE来代替。可是刚才咱们的两个进程没有任何关系,因此就用ftok()算出来一个标识符使用了.总之能够有三种方法让程序指定关键字.一个是用IPC_PRIVATE,让系统产生一个关键字,挑选一个随机数.一个是本身指定,一个就是用ftok()函数. int size 是这块内存的大小. int flag 是这块内存的模式(mode)以及权限标识。 模式可取以下值:        新建:IPC_CREAT                                    使用已开辟的内存:IPC_ALLOC                                    若是标识符以存在,则返回错误值:IPC_EXCL 而后将“模式” 和“权限标识”进行“或”运算,作为第三个参数。 如:    IPC_CREAT | IPC_EXCL | 0666   (例子中的0666为权限标识) 这个函数成功时返回共享内存的ID,失败时返回-1。   3) shmat()将这个内存区映射到本进程的虚拟地址空间。 函数说明: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> void    *shmat( int shmid , char *shmaddr , int shmflag ); shmat()是用来容许本进程访问一块共享内存的函数。 int shmid是那块共享内存的ID。 char *shmaddr是共享内存的起始地址 int shmflag是本进程对该内存的操做模式。若是是SHM_RDONLY的话,就是只读模式。其它的是读写模式 成功时,这个函数返回共享内存的起始地址。失败时返回-1。 4) shmdt()函数删除本进程对这块内存的使用 函数说明: shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。 函数原型: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmdt( char *shmaddr ); 参数char *shmaddr是那块共享内存的起始地址。 成功时返回0。失败时返回-1。 5) shmctl() 控制对这块共享内存的使用 shmctl()函数说明: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int     shmctl( int shmid , int cmd , struct shmid_ds *buf ); int shmid是共享内存的ID。 int cmd是控制命令,可取值以下:         IPC_STAT        获得共享内存的状态         IPC_SET         改变共享内存的状态         IPC_RMID        删除共享内存 struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。若是要改变共享内存的状态,用这个结构体指定。 返回值:        成功:0                 失败:-1 示例程序: struct shmid_ds buf; ... ... shmctl( shmid , IPC_STAT , &buf );      //      取得共享内存的状态 ... ...  shmctl( shmid , IPC_RMID , &buf );      //      删除共享内存 注意!!!:在使用共享内存,结束程序退出后。若是你没在程序中用shmctl()删除共享内存的话,必定要在命令行下用ipcrm命令删除这块共享内存。你要是无论的话,它就一直在那儿放着了。 简单解释一下ipcs命令和ipcrm命令。 取得ipc信息: ipcs [-m|-q|-s] -m      输出有关共享内存(shared memory)的信息 -q      输出有关信息队列(message queue)的信息 -s      输出有关“遮断器”(semaphore)的信息 %ipcs -m 删除ipc ipcrm -m|-q|-s shm_id %ipcrm -m 105 下面再介绍一下struct shmid_ds 的相关构成: struct shmid_ds -----------------------------------------------     shmid_ds数据结构表示每一个新建的共享内存。当shmget()建立了一块新的共享内存后,返回一个能够用于引用该共享内存的shmid_ds数据结构的标识符。 include/linux/shm.h     struct shmid_ds {          struct ipc_perm    shm_perm;      /* operation perms */          int                shm_segsz;     /* size of segment (bytes) */          __kernel_time_t    shm_atime;     /* last attach time */          __kernel_time_t    shm_dtime;     /* last detach time */          __kernel_time_t    shm_ctime;     /* last change time */          __kernel_ipc_pid_t shm_cpid;      /* pid of creator */          __kernel_ipc_pid_t shm_lpid;      /* pid of last operator */          unsigned short     shm_nattch;    /* no. of current attaches */          unsigned short     shm_unused;    /* compatibility */          void               *shm_unused2; /* ditto - used by DIPC */          void               *shm_unused3; /* unused */      }; struct ipc_perm -----------------------------------------------     对于每一个IPC对象,系统共用一个struct ipc_perm的数据结构来存放权限信息,以肯定一个ipc操做是否能够访问该IPC对象。     struct ipc_perm {          __kernel_key_t   key;          __kernel_uid_t   uid;          __kernel_gid_t   gid;          __kernel_uid_t   cuid;          __kernel_gid_t   cgid;          __kernel_mode_t mode;          unsigned short   seq;  };   --------------------------------------------------------- 修改文件及文件夹权限: sudo chmod -(表明类型)×××(全部者)×××(组用户)×××(其余用户) 经常使用修改权限的命令: sudo chmod 600 ××× (只有全部者有读和写的权限) sudo chmod 644 ××× (全部者有读和写的权限,组用户只有读的权限) sudo chmod 700 ××× (只有全部者有读和写以及执行的权限) sudo chmod 666 ××× (每一个人都有读和写的权限) sudo chmod 777 ××× (每一个人都有读和写以及执行的权限)
相关文章
相关标签/搜索