●管道的实质是一个共享文件,因此管道 通信基本上可以借助于文件系统原有的 机制实现,包括(管道)文件的创建 打开、关闭和读写。但是,写入进程和 读出进程之间的相互协调单靠文件系统 机制是解决不了的。读写进程相互协调, 必须做到以下三点 08:48
08:48 ⚫ 管道的实质是一个共享文件,因此管道 通信基本上可以借助于文件系统原有的 机制实现,包括(管道)文件的创建、 打开、关闭和读写。但是,写入进程和 读出进程之间的相互协调单靠文件系统 机制是解决不了的。读写进程相互协调, 必须做到以下三点:
●进程对通信机构的使用应该是互斥的,一个进程正在使用 某个管道写入或读出数据时,另一个进程就必须等待。这 点是进程在读写管道之前通过测试文件节点的特征位来保证 的 发送者和接收者双方必须能够知道对方是否存在,如果对 方已经不存在,就没有必要再发送信息。这时会发出 SIGPIPE信号通知进程; ●由于管道长度有限,发送信息和接收信息之间一定要实现正 确的同步关系。管道文件最多只能提供5120字节的缓冲,管道 的长度对 write和read操作会有影响。如果执行一次写操作,且 管道有足够空间,那么, write把数据写入管道后立即返回;如果 这次操作会引起管道溢出,则本次 write操作必须暂停,直到其 他进程从管道中读出数据,使管道有空间为止,这叫 write阻塞 解决此问题的办法是:把数据进行切分每次最多5120字节,写 完后该进程睡眠,直到读进程把管道中的数据取走,并判别有进 程等待时应唤醒他,以便继续写下一批数据。反之,当读进程读 空管道时,要出现读阻塞,读进程应睡眠,直到写进程唤醒他 08:48
08:48 ⚫ ⚫进程对通信机构的使用应该是互斥的,一个进程正在使用 某个管道写入或读出数据时,另一个进程就必须等待。这一 点是进程在读写管道之前,通过测试文件i节点的特征位来保证 的; ⚫ ⚫发送者和接收者双方必须能够知道对方是否存在,如果对 方 已经 不存 在, 就没 有必 要再 发送 信息 。这 时会发 出 SIGPIPE信号通知进程; ⚫ ⚫由于管道长度有限,发送信息和接收信息之间一定要实现正 确的同步关系。管道文件最多只能提供5120字节的缓冲,管道 的长度对write和read操作会有影响。如果执行一次写操作,且 管道有足够空间,那么,write把数据写入管道后立即返回;如果 这次操作会引起管道溢出,则本次write操作必须暂停,直到其 他进程从管道中读出数据,使管道有空间为止,这叫write阻塞。 解决此问题的办法是:把数据进行切分,每次最多5120字节,写 完后该进程睡眠,直到读进程把管道中的数据取走,并判别有进 程等待时应唤醒他,以便继续写下一批数据。反之,当读进程读 空管道时,要出现读阻塞,读进程应睡眠, 直到写进程唤醒他
共享文件
08:48 共享文件
UNIX中,管道的定义如下: int pipe(files) int files 21; 08:48
08:48 UNIX中,管道的定义如下: int pipe(files); int files[2];
父子进程通过管道传送信息的一个例子: ●# include< stdio.h #define msgsize 16 ●char*msg1=” hello, world#1”; ●char*msg2=”helo, world#2”; ● char msg3=”hell, world#3”; 08:48
08:48 父子进程通过管道传送信息的一个例子: ⚫ #include<stdio.h> ⚫ #define MSGSIZE 16 ⚫ char *msg1=”hello,world#1”; ⚫ char *msg2=”hello,world#2”; ⚫ char *msg3=”hello,world#3”;