linux详细入门教程(十五)------进程间通信(1)

一 、IPC简介

IPC是类UNIX系统中的一个专业术语。
进程间通信就是在不同进程之间传递或交换信息。需要一个不同进程都能访问的存放数据的 公共场所 ,即数据存放介质。
3类 公共场所
进程的用户空间是互相独立的,但共享存储区可公用。
系统空间是公用,但是只有内核具有访问权限。
外设,两个进程可以通过磁盘上的普通文件、或者通过 注册表 (Windows系统)、或者通过第三方数据库进行信息的相互交换。

 

¡ 三种常用的IPC技术
管道
(普通)管道,有两个局限:
l 半双工,只能单向传送数据;
l 只能在同源进程(在进程创建上具有亲缘关系)间使用。
命名管道(FIFO),可以在不相关的进程之间进行通讯。
SysV IPC
三种类型: 消息队列、信号量和共享内存,它们在实现上具有很大的相似性。
最初在AT&T公司的System V.2 UNIX版本中引入。
套接字
主要用于网络通信,可以在不同主机的进程间相互交换信息

 

二、管道 

1、pipe函数 

 可通过调用pipe函数来创建一个管道。

filedes  用于返回文件描述符的数组。
返回值  成功时返回0; 出错时返回-1,并设置errno变量。
说明
filedes[0]为读而打开,filedes[1]为写而打开。filedes[1] 的输出将作为filedes[0]的输入。写入写端的数据将被内核缓存,直到从读端读出。
通常,调用pipe函数的进程会接着调用fork,以创建一个父进程与子进程之间的IPC通道。
fork之后有两个操作选择,这取决于所需建立的管道的数据流向。根据不同流向,在父子进程中要关闭相应端口。
在通信过程中的读、写规则:
当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,以指示到了文件结束处。
如果写一个读端已被关闭的管道,则产生SIGPIPE信号。如果忽略该信号或者捕获该信号并从其处理程序返回,则write出错返回,errno设置为EPIPE。
在写管道时,已写但尚未被读走的字节数应小于或等于PIPE_BUF(4096B).

 

 

 示例

 

 

 

2、popen和pcolse函数

 这两函数用于实现:创建管道,fork子进程,然后关闭管道的不使用端,在子进程中exec一个shell以执行一条命令,然后等待命令的终止。

 

command  将在子进程中执行的命令行字符串。
type  打开方式,应为"r"或"w"二者之一,含义与fopen的第  二个参数一样。
返回值
成功时,popen返回一个文件流指针,pclose返回command的终止状态。
出错时,popen返回NULL,pclose返回-1。
说明
函数popen先调用fork函数创建子进程,然后调用exec函数以执行command,最后返回一个标准I/O文件指针。
popen打开的文件流是全缓存的。
函数pclose关闭标准I/O流,并等待command命令执行结束,最后返回shell的终止状态。
popen函数执行command的方式同system()函数,相当于在Shell下执行:“sh –c command”。

 示例

 

 

 

 三、命名管道

先入先出队列(First In First Out Queue)
FIFO也是一种文件类型。FIFO的路径名存在于文件系统中,创建命名管道类似于创建文件。
可调用mkfifo函数来创建一个命名管道。

 

pathname  要打开或创建的文件的名字。
mode  存取访问权限,同open函数的mode参数。
返回值  成功时返回0,出错时返回-1并设置errno。
说明
新创建的FIFO文件的所有者是当前进程的有效用户,文件的所属组是当前进程的有效组或父目录的所属组。
一旦用mkfifo创建了一个FIFO文件,就可用系统I/O调用(close, read, write, unlink, etc.) 来操作它。
未指定O_NONBLOCK时,以读方式打开FIFO将阻塞到某个其他进程以写方式打开该FIFO。反之,以写方式打开FIFO将阻塞到某个其他进程以读方式打开它。
指定了O_NONBLOCK,则以读方式打开FIFO会立即返回。但是,以写的方式打开没有读端的FIFO将以失败返回,并设置errno为ENXIO。
示例

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重生之我是泰勒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值