社区
Linux/Unix社区
帖子详情
请问,FIFO的读写是否有字节数限制,PIPE_BUF如何使用?
5499
2003-03-19 10:31:27
当使用write()时,可以向FIFO中写入多少字节?
PIPE_BUF是多少?
...全文
254
3
打赏
收藏
请问,FIFO的读写是否有字节数限制,PIPE_BUF如何使用?
当使用write()时,可以向FIFO中写入多少字节? PIPE_BUF是多少?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zengpan_panpan
2003-03-20
打赏
举报
回复
就是说,如果有多个程序同时在一个FIFO上写,为了保证大家写的数据不会互相交错,就应该保证一次写入的数据不操过512字节。如果之有一个程序在写,那么就无所谓了。
5499
2003-03-20
打赏
举报
回复
多谢指教,能否说得更详细一些。
是否尽量一次写入时不要超过512字节?
zengpan_panpan
2003-03-19
打赏
举报
回复
写多少都无所谓。
PIPE_BUF是决定写操作原子性的,如果写的数量不大于PIPE_BUF可以保证原子性。
不同的系统PIPE_BUF大小不同,但是至少512
进程通信.doc
进程通信 Linux进程间通信 一、进程间通信概述 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 C、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 D、资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 E、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 Linux 进程间通信(IPC)以下以几部分发展而来: 早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和POSIX进程间通信。 UNIX进程间通信方式包括:管道、
FIFO
、信号。 System V进程间通信方式包括:System V消息队列、System V信号灯、System V共享内存、 POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。 现在linux
使用
的进程间通信方式: (1)管道(
pipe
)和有名管道(
FIFO
) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket) 二、管道通信 普通的Linux shell都允许重定向,而重定向
使用
的就是管道。例如: ps | grep vsftpd .管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。 管道创建与关闭 创建一个简单的管道,可以
使用
系统调用
pipe
()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道
使用
的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。 系统调用:
pipe
(); 原型:int
pipe
(int fd[2]); 返回值:如果系统调用成功,返回0。如果系统调用失败返回-1: errno=EMFILE(没有空亲的文件描述符) EMFILE(系统文件表已满) EFAULT(fd数组无效) 注意:fd[0]用于读取管道,fd[1]用于写入管道。 图见附件 管道的创建 #include
#include
#include
#include
int main() { int
pipe
_fd[2]; if(
pipe
(
pipe
_fd)<0){ printf("
pipe
create error\n"); return -1; } else printf("
pipe
create success\n"); close(
pipe
_fd[0]); close(
pipe
_fd[1]); } 管道的
读写
管道主要用于不同进程间通信。实际上,通常先创建一个管道,再通过fork函数创建一个子进程。图见附件。 子进程写入和父进程读的命名管道:图见附件 管道
读写
注意事项: 可以通过打开两个管道来创建一个双向的管道。但需要在子理程中正确地设置文件描述符。必须在系统调用fork()中调用
pipe
(),否则子进程将不会继承文件描述符。当
使用
半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。管道实例见:
pipe
_rw.c #include
#include
#include
#include
#include
int main() { int
pipe
_fd[2]; pid_t pid; char
buf
_r[100]; char* p_w
buf
; int r_num; memset(
buf
_r,0,sizeof(
buf
_r));数组中的数据清0; if(
pipe
(
pipe
_fd)<0){ printf("
pipe
create error\n"); return -1; } if((pid=fork())==0){ printf("\n"); close(
pipe
_fd[1]); sleep(2); if((r_num=read(
pipe
_fd[0],
buf
_r,100))>0){ printf("%d numbers read from be
pipe
is %s\n",r_num,
buf
_r); } close(
pipe
_fd[0]); exit(0); }else if(pid>0){ close(
pipe
_fd[0]); if(write(
pipe
_fd[1],"Hello",5)!=-1) printf("parent write success!\n"); if(write(
pipe
_fd[1],"
Pipe
",5)!=-1) printf("parent wirte2 succes!\n"); close(
pipe
_fd[1]); sleep(3); waitpid(pid,NULL,0); exit(0); } }
管道(二)——管道
读写
规则、管道容量
Pipe
Capacity、原子性
PIPE
_
BUF
——linux系统编程
文章目录4种情况下的管道
读写
规则当没有数据可读(若父进程不写而子进程读)当管道满(若父进程写而子进程不读)管道容量
Pipe
Capacity若(父进程)写端突然关闭若(子进程)读端突然关闭linux写入原子性问题 本人的《APUE》《UNPv12》到啦!希望博文质量能有所提高! 4种情况下的管道
读写
规则 我们用代码简单试验在一般情况下(O_NONBLOCK disable,默认阻塞)的4种情况: 1.当没有数据可读 2.当管道满的时候 3.所有管道读端对应的文件描述符被关闭 4.写端对应的文件描述符被关闭
Linux系统编程第05期:进程间通信
无名管道
PIPE
命名管道
FIFO
消息队列 共享内存 信号量 文件锁 信号signal.... 其中还包括system V和POSIX 两种接口标准,除...
UNIX环境高级编程——管道
读写
规则和
pipe
Capacity、
PIPE
_
BUF
一、当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。示例程序如下:#include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include&l...
简述:Linux进程间通信--管道
进程间通信之管道小记 1.无名管道 管道是一种基本的进程间通信机制,作用于亲缘进程之间,完成数据传递。调用
pipe
系统函数即可创建一个管道。
pipe
函数原型如下: #include <unistd.h> int
pipe
(int
pipe
fd[2]);
pipe
fd[0]:读端
pipe
fd[1]:写端 return: 0 成功 -...
Linux/Unix社区
23,120
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章