进程间通信

进程通信方式有:

无名管道、有名管道、信号、3种系统IPC(信号量、消息队列、共享内存)、套接字(socket),共7种。

无名管道(pipe):无名管道数据只能单向流动,具有固定的读端和写端,而且只能在具有亲缘关系的进程间使用。

有名管道(fifo) :有名管道数据只能单向流动,但是它允许无亲缘关系进程间的通信。

信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

信号量(sempore):是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

消息队列(msgget):就是一个消息的链表。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。

共享内存(share memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。


其中消息队列,共享内存,套接字,有名管道,无名管道可以传递信息,信号,信号量主要用来同步,不能传递消息。


通信范围:

有名管道,共享内存、消息队列、套接字、信号量可以跨进程,不仅可以跨父子进程,还可以在不相关的进程间进行通信。

无名管道只能在具有亲缘关系的进程间进行通信、进程的亲缘关系通常是指父子进程关系。

信号是可以跨进程的但必须知道进程号才可以,大多数发送信号的函数不能跨进程(父子进程都不行),kill(pid_t,sig)函数可以跨进程但必须知道进程号。




共享内存:

int shmget(key_t key, int size, int shmflg);//创建共享内存,也可用ftok()函数来创建key_t值。

void *shmat(int shmid, const void *shmaddr, int shmflg);//共享内存映射

int shmdt(const void *shmaddr);取消共享内存映射

int shmctl(int shmid,  int cmd,  struct shmid_ds  *buf);//操作共享内存标识符,设置、获取、删除、内存映射对象
消息队列:

int msgget(key_t key, int flag);//创建消息队列,也可用ftok()函数来创建key_t值。

int msgsnd(int msqid, const void *msgp, size_t size, int flag);//发送消息

int msgrcv(int msgid,  void* msgp,  size_t  size,  long msgtype,  int  flag);//接收消息

int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );//操作消息队列标识符,设置、获取、删除、对象

信号量
int semget(key_t key, int nsems, int semflg);//创建信号量,也可用ftok()函数来创建key_t值。
int semop ( int semid, struct sembuf  *opsptr,  size_t  nops);//进行V操作,P操作
int semctl ( int semid, int semnum,  int cmd…/*union semun arg/);//设置、获取、删除信号灯集

信号:

int sigemptyset (sigset_t *set);//清空此信号集

int sigaction (int signum, const struct sigaction *restrict action, struct sigaction *restrict old-
 action);//重新定义信号处理函数

sighandler_t signal (int signum, sighandler_t action);//重新定义信号处理函数

unsigned int alarm (unsigned int seconds);发送SIGALRM(闹钟信号)不能跨进程

 int raise (int signum);给当前进程发送指定的信号。不能跨进程

int kill (pid_t pid, int signum);给进程号为pid的进程发送指定的信号。可以跨进程

void abort(void);发送结束信号,一般用于结束该进程,因为该函数总是会成功所以没有返回值

int pause ();等待知道收到一个信号


有名管道:
int mkfifo (const char *filename, mode_t mode);//创建管道
int open (const char *filename, int flags);//打开管道

ssize_t write (int filedes, const void *buffer, size_t size);//写入数据

ssize_t read (int filedes, void *buffer, size_t size);//读取数据

无名管道:

int pipe (int filedes[2]);//创建管道文件,一个读端filedes[0]和一个写端filedes[1],这个规则不能变。

ssize_t write (int filedes, const void *buffer, size_t size);//写入数据,一个写端filedes[1]

ssize_t read (int filedes, void *buffer, size_t size);//读取数据,filedes=filedes[0]





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值