进程间通信
无名管道 pipe
有名管道 fifo
信号 signal
system V IPC对象
共享内存 share memory
消息队列 message queue
信号灯 semaphore
BSD
套接字 socket
管道是基于文件描述符的通信方式。
无名管道
int pipe(int pipefd[2]);
当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。
有名管道
进程通过文件IO来操作有名管道
int mkfifo(const char *filename,mode_t mode);
内存共享
查看 system("ipcs -m");
int shmget(key_t key, int size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
struct shmid_ds
int shmdt(const void *shmaddr);//撤销 共享内存映射
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
消息队列
int msgget(key_t key, int flag);
int msgsnd(int msqid, const void *msgp, size_t size, int flag);
struct msgbuf
int msgrcv(int msgid, void* msgp, size_t size, long msgtype, int flag);
int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
信号灯
种类:
posix有名信号灯
posix基于内存的信号灯(无名信号灯)
System V 信号灯(IPC对象)
ystem V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯;而Posix信号灯指的是单个计数信号灯.
System V 信号灯由内核维护
System V 信号灯
int semget(key_t key, int nsems, int semflg);
int semop (int semid, struct sembuf opsptr, size_t nops);
struct sembuf;
int semctl (int semid, int semnum, int cmd…/*union semun arg*/);
----------------------------------------------------------------------------------------------
进程间通讯方式比较
pipe: 具有亲缘关系的进程间,单工,数据在内存中
fifo: 可用于任意进程间,双工,有文件名,数据在内存
signal:唯一的异步通信方式
msg: 常用于cs模式中, 按消息类型访问 ,可有优先级
shm: 效率最高(直接访问内存) ,需要同步、互斥机制
sem: 配合共享内存使用,用以实现同步和互斥
----------------------------------------------------------------------------------------------
总结
IPC
消息传递:signal、PIPE、FIFO、message queue
共享存储:share file、share memory
同步机制:locked file、locked region、semaphore set
ITC
消息传递:FIFO、message queue
共享存储:share file、share memory、global variable、heap memory
同步机制:locked file、locked region、semaphore set、
thread semaphore、thread mutex、thread rwlock、
thread condition variable