抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

进程间的通信方式

  • 管道
  • 消息队列
  • 共享内存
  • 信号量
  • 信号
  • Socket

管道

管道方式举例: | 就是一个匿名管道将ps aux的输出作为后一个命令的输入,而且很显然管道是单向的。双向通信就需要两个管道。

1
ps aux | grep mysql

管道分类

  • 匿名管道 | (用完就销毁)
  • 命名管道 FIFO (数据是先进先出的形式)
1
mkfifo myPipe

myPipe 就是我们创建的管道的名称,linux一切皆文件这个pipe的文件类型是P

1
2
song@MateBooke13:~$ ls -l pipe
prw-r--r-- 1 song song 0 Aug 16 20:51 pipe

往管道写入数据

1
2
echo "hello" > pipe //写入数据
//卡住

管道的原理

管道就是内核的一串缓存,从管道的一段写入数据,实际上就是缓存在内核中的,另一端读取也就是从内核中读取这段数据。另外管道传输的数据是无格式的且大小受限。

匿名管道必须在父子进程中进行。而命名管道无此限制 在shell中执行 A|B,A和B都是shell创建的子进程。

缺点

  • 管道的通信方式效率很低,不适合在进程间频繁的交换数据。

消息队列

消息队列可以解决管道的缺点。A进程给B发消息,A把数据放到消息队列里面就可以走了。B需要的时候就去取
消息队列是保存在内核中的消息链表,发送前要确认好数据格式。消息队列随内核存在。

缺点

  • 通信不及时
  • 邮件大小有限制
  • 通信过程存在切换内核态开销

共享内存

共享内存是为了解决消息队列存在内核态和用户态切换的问题。
共享内存的机制就是拿出一块虚拟地址,映射到相同的物理内存中,这个对内存的读取另一个进程马上就能看到。

缺点

  • 共享内存区域在多个进程同时修改同一个共享内存时,内容被覆盖

    信号量

    信号量时为了防止多进程竞争共享资源的一种保护机制(PV操作实现进程的互斥与同步)
    以上都是常规状态下的工作模式

    信号

    linux下为了响应各种事件,提供了几十种信号,分别带别不同的意义。(kill -l 查看)

  • Ctrl +C 产生SIGINT信号终止进程

  • CTRL+Z SIGTSTP 停止该进程

  • kill -9 1050 表示给PID1050发送SIGKILL信号,来立即结束进程

    Socket

    socket来实现跨网络通信

评论