进程间通信

 

传统的进程间通信方式:无名管道(pipe)、有名管道(fifo)和信号(signal)

System V IPC对象:共享内存(share memory)、消息队列(message queue)和信号灯(semaphore)

BSD:套接字(socket)

1、无名管道

        无名管道只能用于具有亲缘关系的进程之间的通信。管道是基于文件描述符的通信方式,当一个管道建立时(int pipe(int fd[2])),它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。构成一个半双工通道。

2、有名管道

        有名管道可以使互不相关的两个进程互相通信。

         创建管道函数int mkfifo(const char *filename,mode_t mode);

3、信号通信

         发送信号  int kill(pid_t pid,int sig);

        捕捉信号  int raise(int sig);

        void (*signal(int signum,void(*handler)(int)))(int);//signal(SIGINT,my_func);

4、共享内存

           共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝

            使用步骤:

                             (1)创建/打开共享内存   shmget

                              (2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问  shmat

                              (3)撤销共享内存映射 shmdt

                              (4)删除共享内存对象

            操作共享内存:shmctl

5、消息队列

                 (1)创建/打开消息队列 msgget

                 (2)添加消息  msgsnd

                  (3)读取消息 msgrcv

                  (4)控制消息队列 msgctl

6、信号灯

                信号灯也叫信号量,它是不同进程间或一个给定进程内部不同线程间同步的机制。

               System V 信号灯(semget ,semop,semget,semctl)

进程间通信方式比较

pipe:具有亲缘关系的进程间,单工,数据在内存中

fifo:可用于任意进程间,双工,有文件名,数据在内存

signal:唯一的异步通信方式

msg:常用于cs模式中,按消息类型访问,可有优先级

shm:效率最高,需要同步、互斥机制

sem:配合共享内存使用,用以实现同步和互斥

注:函数不懂请自己man - -

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值