进程间通信
interprocess communication, IPC
管道,无名管道和有名管道,它们是和内存中的一个索引点相关联的两个文件描述符。
创建管道
#include <unistd.h>
int pipe(int filedes[2]);
FIFO
int mkfifo(const char *pathname, mode_t mode);
共享内存
创建共享内存区
int shmget(key_t key, int size, int flags);
附加共享内存
char* shmat(int shmid, char *shmaddr, int flags);
分离共享内存区
int shmdt(char *shmadr);
消息队列
是一个消息的链接列表,消息都保存在内核中,进程通过一种共享内存区使用的标识符同种类的
标识符标识消息。
创建一个新队列或打开一个已有的队列。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int flags);
向队列中写入消息
int msgsnd(int msqid, const void *prt, size_t nbytes, int flags);
struct msgbuf
{
long mtype;
char mtext[1];
};
这个结构声明实际只是一个模板,可以进行扩展以满足应用程序的需要,msgbuf可简单地看作是
一个long型整数后跟消息数据,消息数据可以采用你觉得合适的格式。
读取队列中的消息
int msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flags);
删除消息队列
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调用创建或访问的信号灯上执行操作。
int semop(int semid, struct sembuf *semops, unsigned nops);
struct sembuf
{
short sem_num;
short sem_op;
short sem_flg;
};
控制信号灯
int semctl(int semid, int semnum, int cmd, union semun arg);
interprocess communication, IPC
管道,无名管道和有名管道,它们是和内存中的一个索引点相关联的两个文件描述符。
创建管道
#include <unistd.h>
int pipe(int filedes[2]);
FIFO
int mkfifo(const char *pathname, mode_t mode);
共享内存
创建共享内存区
int shmget(key_t key, int size, int flags);
附加共享内存
char* shmat(int shmid, char *shmaddr, int flags);
分离共享内存区
int shmdt(char *shmadr);
消息队列
是一个消息的链接列表,消息都保存在内核中,进程通过一种共享内存区使用的标识符同种类的
标识符标识消息。
创建一个新队列或打开一个已有的队列。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int flags);
向队列中写入消息
int msgsnd(int msqid, const void *prt, size_t nbytes, int flags);
struct msgbuf
{
long mtype;
char mtext[1];
};
这个结构声明实际只是一个模板,可以进行扩展以满足应用程序的需要,msgbuf可简单地看作是
一个long型整数后跟消息数据,消息数据可以采用你觉得合适的格式。
读取队列中的消息
int msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flags);
删除消息队列
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调用创建或访问的信号灯上执行操作。
int semop(int semid, struct sembuf *semops, unsigned nops);
struct sembuf
{
short sem_num;
short sem_op;
short sem_flg;
};
控制信号灯
int semctl(int semid, int semnum, int cmd, union semun arg);