打开和关闭管道
#include <unistd.h>
int pipe(int filedes[2]);
可以用close函数关闭。
请记住,read从filedes[0]中读出数据,而write想filedes[1]写入数据。
创建FIFO
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
打开和关闭FIFO
打开、关闭、删除、读取和写入FIFO分别使用系统调用open、close、unlink、read和write来完成。
内存共享
创建共享内存区
#include <sys/types.h>
#incldue <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, int size, int flags);
添加共享内存区
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
char *shmat(int shmid, char *shmaddr, int flags);
int shmdt(char *shmadr);
总是把shmaddr设置为0。shmat附加在shmaddr的段从调用进程的地址空间中分离出去。这个地址必须是调用shmget返回的。
消息队列
创建和打开消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int flags);
向队列中写入消息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *ptr, size_t nbytes, int flags);
ptr是指向msgbuf结构的指针,这个结构由消息类型和组成消息的数据字节所构成嗯。
msgbuf在<sys/msg.h>的定义如下
struct msgbuf{
long mtype;
char mtext[1];
};
读取队列中的消息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flags);
删除消息
msgctl函数提供了对消息队列的在一定程度上的控制功能。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
信号量
创建信号量
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int flags);
semop函数是最常用的信号灯例程。它在一个或多个由semget调用创建或访问信号灯上执行操作。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *semops, unsigned nops);
semid是先前semget返回的信号灯标识符,它指向要操作的信号灯几何。nops是semops指向的sembuf结构数组的元素个数。
struct sembuf
{
short sem_num;
short sem_op;
short sem_flg;
};
文章评论(0条评论)
登录后参与讨论