linux c 有名管道,linuxC-进程间通信-有名管道fifo.pdf

253b171540df25e1b84436cbe50dfc72.giflinuxC-进程间通信-有名管道fifo.pdf

进程间通信有名管道 fifo 简介 无名管道 ,它只能用于具有亲缘关系的进程之间,这就大大地限制了管道的使 用。有名管道的出现突破了这种限制,它可以使 互不相关 的两个进程实现彼此通 信。该管道可以通过路径名来指出,并且在文件系统中是 可见的。在建立了管道 之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。 FIFO 是严格地 遵循先进先出规则 的,对管道及 FIFO 的读总是从开始处返回 数据,对它们的写则把数据添加到末尾,它们不支持如 lseek等文件定位操作。 有名管道的创建可以使用函数 mkfifo, 该函数类似文件中的 open操作,可以指 定管道的路径和打开的模式。 进程通过文件 IO 来操作有名管道,有名管道创建之后,任何进程都可以访 问。 fifo 打开方式 在创建管道成功之后,就可以使用open、read和 write这些函数了。与 普通文件的开发设置一样,对于为读而打开的管道可在open中设置 O_RDONLY ,对于为写而打开的管道可在open中设置 O_WRONLY 。 1.如果打开的时候是,是以只读方式(O_RDONLY )打开的,则 open返回 的文件描述符 fd 是只读的。 2.如果打开的时候是,是以只写方式O_WRONLY 打开的,则 open返回的 文件描述符 fd 是只写 的 3.如果打开的时候是,是以读写方式O_RDWR打开的,则 open返回的文 件描述符 fd 是读写的 fifo 读写特性 由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以 在open函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。 (1)对于读进程。 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果 FIFO内没有数据,则读函数将立刻返回0。 (2)对于写进程。 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。 fifo 创建函数 mkfifo函数格式 表8.4列出了mkfifo函数的语法要点。 表 8.4mkfifo函数语法要点 所需头文件 include include 函数原型 int mkfifoconst char *filename,mode_t mode 函数传入值filename要创建的管道 函数传入值mode O_RDONLY 读管道 O_WRONLY 写管道 O_RDWR 读写管道 O_NONBLOCK 非阻塞 函数传入值mode O_CREAT 如果该文件不存在,那么就创建一个新的文件,并用 第三个参数为其设置权限 O_EXCL 如果使用 O_CREAT 时文件存在,那么可返回错误消息。 这一参数可测试文件是否存在 函数返回值 成功 0 出错1 再对FIFO相关的出错信息做一归纳,以方便用户查错。 FIFO 相关的出错信息 EACCESS 参数 filename 所指定的目录路径无可执行的权限 EEXIST 参数 filename 所指定的文件已存在 ENAMETOOLONG 参数 filename 的路径名称太长 ENOENT 参数 filename 包含的目录不存在 ENOSPC 文件系统的剩余空间不足 ENOTDIR 参数 filename 路径中的目录存在但却非真正的目录 EROFS 参数 filename 指定的文件存在于只读文件系统内 fifo 创建终端命令 用户还可以在命令行使用“mknod 管道名 p”来创建有名管道。 还可以运用 mkfifo 有名管道名 创建文件 命令 mkfifo 和有名管道函数创建一样。 典型的 fifo 模型 C/S模型 fifo 示例 第一个文件 create_fifo.c主要是创建一个管道文件,也可以用mkfifo 命令来 创建一个管道。 管道创建好之后可以在文件系统中看到,同时也可以看到文件的大小为0。 create_fifo.c 创建好之后的运行效果。下面的程序要运用到否创建的这个管道文件。 read_fifo.c这是读取管道,从管道中读取文件。 write_fifo.c 程序的运行的结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值