首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核编程--管道pipe

管道的定义: 管道是一种进程间通信机制,也是Linux操作系统中的一种文件形式。一个进程写入管道的数据可以被另一个进程读取。数据按先进先出顺序处理。Linux有两种形式的管道文件,管道和FIFO。...管道的创建: 管道由pipe函数创建 #include int pipe(int fd[2]) --创建一个管道并将管道读写端的文件描述符(分别)放入fd[0]和fd[1] --.... */ if(pipe(mypipe)) { fprintf(stderr, "Pipe failed....close(rfd); } unlink(fn); } } *为了保证进程访问管道和FIFO的原子性,需要对管道和FIFO加以限制: OPEN_MAX: 一个进程在任意时刻打开的最大描述符数...PIPE_BUF:可原子地写往一个管道或FIFO的最大数据量 shell脚本中的管道指令: 参考阅读: https://www.ibm.com/docs/en/ https://www.gnu.org

3.6K10

linux 进程通信-管道(pipe)《Rice linux 学习开发》

Pipe概述 管道是Linux中进程间通信的一种方式,它分为三种:无名管道,标准流管道,有名管道。... 用pipe()函数创建的管道两端处于一个进程中,由于管道主要用于不同进程间的通信,因此实际应用中没有太大意义。.../pipe”等,由于这一类操作很常有,因此标准流管道就将一系列的创建过程合并到一个函数popen()完成 标准流管道的使用可以大大减少代码的编写量,但同时也有一些不利之处...则写操作将一直阻塞到数据可以被写入 若管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败 例程 通道例程中,提供了有名管道的读例程和写例程,例程请参考我github的pipe...github链接:https://github.com/RiceChen/Linux-process-communication.git,记得加个star

1.6K20

Linux进程间通信--管道(pipe和fifo)

pipe        首先先来说一下pipe,这是一个匿名管道(为啥叫匿名呢,下面讲命名管道的时候就知道了),实现方式是循环队列,它只能用于有血缘关系的进程间通信。...首先我们先来看一下pipe函数的原型: #include int pipe(int pipefd[2]);        传入的参数是一个大小为...用一个父子进程来举例,如果要实现父子进程间的通信,在fork前就需要创建一个pipe管道,如果创建成功返回0,如果失败返回-1并设置errno,由于子进程复制了父进程的PCB,所以子进程也有父进程的文件描述符表...,因此父子进程的pipefd都指向了同一个pipe管道,然后我们要规定管道的传输方向,如果我们要求父写子读的话,我们就在父进程中close(pipefd[0]),在子进程中close(pipefd[1]...那么在使用pipe通信的时候可能会遇到以下的几种情况: 1. 当读管道时,如果管道中没有数据,则会阻塞,直到管道另一端写入数据。           2.

3.6K30

linux系统编程之管道(一):匿名管道和pipe函数

二、管道是一种最基本的IPC机制,由pipe函数创建: #include int pipe(int filedes[2]); 调用pipe函数时在内核中开辟一块缓冲区(称为管道...pipe函数调用成功返回0,调用失败返回-1。 开辟了管道之后如何实现两个进程间的通信呢?比如可以按下面的步骤通信。 ?...(pipefd) == -1)         ERR_EXIT("pipe error");     pid_t pid;     pid = fork();     if (pid == -1)...父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。 2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。 3. 父进程关闭管道写端,子进程关闭管道读端。...参考:《APUE》、《linux c 编程一站式学习》

2K00

Linux缓存机制bufferscached

缓存机制:Linux引入了buffers和 cached机制,buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件元数据,这样当操作系统需要读取某些文件时,首先在buffers...为了方便查找文件,linux引入目录项(dentry)描述目录与文件的关系树,Linux为每一个目录建立一个目录项,也为每个文件建立一个目录项。...在Linux系统中数据可分为两大类,数据和元数据,数据泛指普通文件中的实际数据,元数据是用来描述一个文件的特征的系统数据。...根据Linux虚拟内存管理机制,这种行为是正常的。要理解为什么缓存会变得如此之高,以及为什么这不是一个问题,就必须了解I/O在Linux上是如何工作的。...从Linux缓存机制来说,buffers和cached都是系统可用内存,通常情况下看到bufferes和cached占用内存多,这是一个正常现象,它不是一个问题,所以在看到物理内存快要耗尽时,不要惊慌,

4.6K10

浅谈Linux内核中页缓存和块缓存

中块缓存关联,每个块缓存和磁盘的盘块进行关联。...块缓存缓存的单个块大小是以磁盘扇区大小,默认是512个字节。无论应用程序读取多少个字节,在最终访问磁盘的时候,都必须以扇区大小(512个字节)读取;对应的块缓存缓存块大小页是扇区的大小。...Page Cache(页缓存) Linux页高速缓存任何基于页的数据,所缓存的Page包括普通文件内容、块设备文件、内存映射文件的读写。页缓存中一个页帧的文件数据锁对应的磁盘块不必是连续的。...针对块设备文件的页缓存则是磁盘盘块在物理磁盘上是连续的。 页缓存中采用了struct address_space数据结构来管理。它特指一个文件内容所形成的的页缓存空间。...) 块缓存和页缓存是相对独立的两种缓存机制,通常也可以结合在一起共同描述页缓存中保存文件的数据,向上以页为单位于页缓存交互,向下以块缓存为单位和通用设备层进行交互。

2.7K30

聊聊linux的文件缓存

序本文主要研究一下linux的文件缓存文件缓存linux使用page cache来缓存最近读取的文件,也有目录结构(dcache: Directory Entry Cache)缓存及inode缓存,它们都使用了...sys/vm/dirty_background_ratio这样子来查看vm.dirty_background_ratio与vm.dirty_background_bytes用于设置内存中可以存储脏数据的最大数量...vm.dirty_background_ratio=10sudo sysctl -w vm.dirty_background_bytes=511870912vm.dirty_ratio与vm.dirty_bytes用来设置整个系统可以存储脏数据的最大数量的...grep ^CachedCached: 3336092 kBCached: 3169224 kB可以看到这里无法释放锁定的cache,可以通过memlock来限定每个进程最大锁定的大小...memlock unlimited查看ulimit -Ha | grep lockedmax locked memory (kbytes, -l) 2033684小结linux

10010

Linux内核的冷热缓存

缓存为什么会有冷热? 究其原因,是因为对于内存的访问,可能是CPU发起的,也可以是DMA设备发起的。 如果是CPU发起的,在CPU的硬件缓存中,就会保存相应的页内容。...如果这个页本来没有存在于硬件缓存中,那么它的到来,势必会将原本为其他的页缓存的内容挤出硬件缓存。...但是,如果对于内存的访问是由DMA设备发起的,那么该页不会被CPU访问,就不需要在CPU的硬件缓存中进行缓存,也不会对已经缓存在硬件缓存中的页内容造成伤害。...在Linux操作系统中,每个内存区域(Zone)都分配了hot cache和cold cache,hot cache用来缓存那些很可能被CPU的硬件缓存收纳了的页。...如果gfp_flags中指定的__GFP_COLD,则从冷缓存中分配一页,否则,从热缓存中分配。

1.8K20

Linux 进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

随后,每个进程关闭自己不需要的一个连接 (两个黑色的箭头被关闭; Process 1关闭从PIPE来的输入连接,Process 2关闭输出到PIPE的连接),这样,剩下的红色连接就构成了如上图的PIPE...实现细节: 在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。...关于管道的读写 管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道写函数pipe_wrtie()。...Linux函数原型 #include int pipe(int filedes[2]); filedes[0]用于读出数据,读取时必须关闭写入端,即close(filedes[1...为了解决这一问题,Linux提供了FIFO方式连接进程。FIFO又叫做命名管道(named PIPE)。

2.3K30

linux 查找最大文件 方法

Linux上查找最大文件的 3 种方法第一种:ls最简单的方法就是借助 ls 命令,因为 ls 命令本身输出是带文件大小信息的。...比如,我要列出 /bin 目录中的 5 个最大文件,可以:ls -lSh /bin | head -5 第二种:findfind 本身就是查找命令,可以递归查找一个目录的子目录,所以用它是自然的。...比如,查找 / 目录下最大的一个文件:sudo find / -type f -printf "%s\t%p\n" | sort -n | tail -1 如果要找前 10 个大文件呢,可以这样:$...-ls 也可以查找一个区间大小的(比如 100MiB 和 200MiB )之间的文件:find / -size +100M -size -200M -ls 最后,下面这个命令也比较常用,查找某个目录最大的...比如,查找 /home 下前 20 个最大的文件:sudo du -a /home | sort -n -r | head -n 20 查找当前文件夹中最大的 10 个目录:sudo du -a | sort

4.5K30
领券