8种进程间通信:共享内存、消息队列、信号量、信号、命名管道、无名管道、文件、socket
共享内存
用于在程序之间高效地共享数据
POSIX
- shm_open
- shm_unlink
- ftruncate
- fstat
- mmap
- munmap
System V
# 创建
int shmget(key_t key, size_t size, int shmflg)
# 连接共享内存段到进程地址空间
void *shmat(int shm_id, const void *shm_addr, int shmflg)
# 将共享内存段从当前进程中分离
int shmdt(int shm_id)
# 控制
int shmctl(int shm_id, int command, struct shmid_ds *buf)
消息队列
在程序之间传递数据的一种简单方法
POXIS
- mq_open
- mq_close
- mq_unlink
- mq_getattr
- mq_setattr
- mq_send
- mq_receive
- mq_notify
System V
# 创建
int msgget(key_t key, int msgflg)
# 添加消息到消息队列
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg)
# 从消息队列中获取消息
int msgrcv(int msqid, void *msg_ptr, size_t, msg_sz, long int msgtype, int msgflg)
# 控制
int msgctl(int msqid, int command, struct msqid_ds *buf)
信号量
用于管理对资源的访问
POSIX函数
POSIX信号量既可用于进程间通信也可用于线程间同步
- sem_open
- sem_close
- sem_unlink
- sem_init
- sem_destroy
- sem_wait
- sem_trywait
- sem_post
- sem_getvalue
System V函数
#include <sys/sem.h>
int semctl(int sem_id, int sem_num, int command, ...)
int semget(key_t key, int num_sems, int sem_flags)
int semop(int sem_id, struct sembuf *sem_ops, siz
信号
系统响应某些条件而产生的一个事件。接收到该信号的进程会相应地采取一些行动。
# 信号处理
void (*signal(int sig, void (*func)(int)))(int)
# 发送信号
int kill(pid_t, int sig)
unsigned int alarm(unsigned int seconds)
# 挂起直到有信号出现
int pause(void)
# 信号处理
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
命名管道
管道本质上是内核的一块缓存。把一个进程连接到另一个进程的一个数据流称为一个“管道”,通常是用作把一个进程的输出通过管道连接到另一个进程的输入。
#include <unistd.h>
int mkfifo(const char *filename,mode_t mode);
参数:
filename:创建的有名管道的全路径名
mode:创建的命名管道的模式,指明其存取权限
无名管道
#include <unistd.h>
int pipe(int pipefd[2]);
参数:fd为文件描述符数组,其中fd[0]表示读端,fd[1]表示写端
返回值:成功返回0,失败返回-1