进程间通信机制(IPC-Inter Process Communication)接口简介

    xiaoxiao2021-04-13  33

    1 linux的信号量机制

    1.1 semget函数

    semget函数作用是创建一个新信号量,或去的一个已有信号量的键 int semget(key_t key, int num_sems, int sem_flags); key:整数值。不相关的进程可以通过它访问同一个信号量。(键<-->信号量标识符)(所有其他信号量函数都是使用由semget函数返回的信号量标识符) num_sems:指定需要的信号量数目。(一般是1) sem_flags:标志,例如:设置为IPC_CREATE 和 IPC_EXCL 可以确保创建出的是一个新的、唯一的信号量。 返回:成功时返回一个正数,即 信号量标识符。

    1.2 semop函数

    semop函数用于改变信号量的值。定义如下: int semop(int sem_id, struct sembuf* sem_ops, size_t num_sem_ops); struct sembuf{ short  sem_num;//信号量编号 short sem_op;//信号量在一次操作中需要改变的数值(-1 - p    1 - v) short sem_flg;//通常被设置为SEM_UNDO,操作系统跟踪当前进程对这个信号量的修改情况。OS自动释放该进程持有的信号量。 } sem_id:由semget函数返回的信号量标识符

    1,3 semctl函数

    semctl函数是用来直接控制信号量信息,定义如下: int semctl(int sem_id, int sem_num, int command, ...); sem_num:信号量编号,当需要用到承租的信号量时,就要用到这个参数,一般取值0,表示这是第一个也是唯一的一个信号量。 command:将要采取的动作。如果有第四个参数,将会是union semun结构, union semun{ int val; struct semid_ds *buf; unsigned short *array } command通常取下面两个参数: SETVAL:用来把信号量初始化为一个已知的值。这个值通过union semun中的val成员设置,其作用是在信号量第一次使用之前对它进行设置。 IPC_RMID:用于删除一个已经无需继续使用的信号量标识符。

    1.4 使用信号量

    2 共享内存

    2.1shmget函数

    用shmget()函数来创建共享内存: int shmget(key_t key, siize_t size, int shmflg); 返回一个共享内存标识符,该标识符用于后续的共享内存函数。 key:为共享内存段命名。(有一个特殊的键值IPC_PRIVATE:用于创建一个只属于创建进程的共享内存,通常不会用到。) size:以字节为单位指定需要共享内存的容量。 shmflg:9比特的权限标识。由IPC_CREAT定义的一个特殊比特必须和权限标志 按位或才能创建一个新的共享内存段。

    2.2shmat函数

    第一次创建共享内存段时,它不能被任何进程访问。要想启动对该共享内存的访问,必须将其连接到一个进程的地址空间中。这项工作由shmat函数完成,定义如下: void* shmat(int shm_id, const void* shm_addr, int shmflg); shm_id:shemget返回的共享内存标识符。 shm_addr:指定共享内存连接到当前进程的位置。通常是一个空指针,表示让系统来选择共享内存出现的地址。 shmflg:有两个可能的取值SHM_RND SHM_RDONLY 返回:如果调用成功,返回一个纸箱共享内存第一个字节的指针,如果失败:-1

    2.3shmdt

    shmdt函数作用是将共享内存从当前进程中分离。参数是shmat返回的地址指针。成功:返回0,失败:返回-1。注意,将共享内存分离并未删除它,只是使得该共享内存对当前进程不在可用。

    2.4shmctl

    共享内存控制函数: int shmctl(int shm_id, int command, struct shmid_ds *buf); struct shmid_ds{ uid_t shm_perm.uid; uid_t shm_perm.g id; mode_t shm_perm.mode; } 第二个参数command是要采取的动作,可以取三个值: IPC_STAT:把shmid结构中的数据设置为共享内存的当前关联值 IPC_SET:如果进程有足够权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值 IPC_RMID:删除共享内存段。 buf:指向包含共享内存模式和访问权限的结构。

    3.消息队列

    与命名管道相比,消息队列的优势在于:独立于发送和接收进程而存在。消除了在同步命名管道的打开和关闭时产生的一些困难。(不需要又进程自己来提供同步方法。这是消息相对于管道的一个明显优势)
    转载请注明原文地址: https://ju.6miu.com/read-669413.html

    最新回复(0)