进程间通信

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值