POSIX IPC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rikeyone/article/details/89032302

信号量

#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <semaphore.h>

sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
                mode_t mode, unsigned int value);

int sem_post(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
int sem_close(sem_t *sem);
int sem_unlink(const char *name);

Link with -pthread.

sem_open
创建或者打开信号量
sem_wait/sem_trywait/sem_timedwait
等待信号量>0
sem_post
释放信号量
sem_close
关闭信号量
sem_unlink
删除信号量

消息队列

#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <mqueue.h>

mqd_t mq_open(const char *name, int oflag);
mqd_t mq_open(const char *name, int oflag, mode_t mode,
              struct mq_attr *attr);

int mq_send(mqd_t mqdes, const char *msg_ptr,
              size_t msg_len, unsigned msg_prio);
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,
                   size_t msg_len, unsigned *msg_prio);
#include <time.h>
int mq_timedsend(mqd_t mqdes, const char *msg_ptr,
              size_t msg_len, unsigned msg_prio,
              const struct timespec *abs_timeout);
ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr,
                   size_t msg_len, unsigned *msg_prio,
                   const struct timespec *abs_timeout);
				   
int mq_close(mqd_t mqdes);
int mq_unlink(const char *name);
int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
int mq_setattr(mqd_t mqdes, struct mq_attr *newattr,
                 struct mq_attr *oldattr);
 int mq_notify(mqd_t mqdes, const struct sigevent *sevp);
Link with -lrt.

mq_open
创建或者打开一个消息队列。对于命名消息队列name的格式为"/somename",只允许包含一个’/’。
一般情况下我们此名称会选择app的名字来创建消息队列,这样不同app之间就可以通过名字来寻找到对应的消息队列了。
mq_send
发送消息
mq_receive
接收消息
mq_close
关闭消息队列描述符
mq_unlink
删除消息队列
mq_getattr/mq_setattr

 struct mq_attr {
     long mq_flags;       /* Flags: 0 or O_NONBLOCK */
     long mq_maxmsg;      /* Max. # of messages on queue */
     long mq_msgsize;     /* Max. message size (bytes) */
     long mq_curmsgs;     /* # of messages currently in queue */
 };

获取和设置消息队列属性。
mq_notify
注册一个异步执行的callback,当消息队列状态由空状态收到一个message时会执行该通知。

管理消息队列的proc文件节点:

/proc/sys/fs/mqueue/msg_max
      消息队列中允许的最大消息数量。

/proc/sys/fs/mqueue/msgsize_max
       消息队列中最大允许的消息数据量size。

/proc/sys/fs/mqueue/queues_max
       系统能够创建的消息队列最大数量。

共享内存

#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>        /* For mode constants */
#include <fcntl.h>           /* For O_* constants */

int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
int ftruncate(int fildes, off_t length);
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
int munmap(void *addr, size_t len);
int close(int fildes);
int fstat(int fildes, struct stat *buf);
int fchown(int fildes, uid_t owner, gid_t group);
int fchmod(int fildes, mode_t mode);

Link with -lrt.

shm_open
创建或者打开一个共享内存,返回关联的文件描述符,name的格式是"/somename",第一个字符为’/’,并且只能包含这一个。

shm_unlink
删除一个共享内存。

close
关闭共享内存关联的文件描述符。

ftruncate
设置共享内存对象的大小,新创建的共享内存对象大小为0.

mmap
将共享内存对象映射到调用进程的虚拟地址空间.

munmap
取消共享内存对象到调用进程的虚拟地址空间的映射.

fstat
查看对应共享内存的状态。

fchown
修改共享内存的所属主。

fchmod
修改共享内存的权限

猜你喜欢

转载自blog.csdn.net/rikeyone/article/details/89032302
IPC
今日推荐