在没有写/读的情况下命名当前表示为buffer的文件是不可能的。因为在计算机中,文件是用来存储和读取数据的,而buffer是用来临时存储数据的一块内存区域。在没有进行读写操作的情况下,文件并不存在,因此也无法对其进行命名。命名文件是为了在文件系统中标识和访问文件,而在没有读写操作的情况下,文件并没有被创建或存在,因此无法进行命名。
这个数组用于存储管道的两个文件描述符:pipefd[0]表示管道的读端,而pipefd[1]表示管道的写端。...管道中没有数据时,读端继续读取的默认行为是阻塞当前正在读取的进程。...最后就会读到返回值为0,表示读结束,类似读到了文件的结尾 读端关闭其文件描述符并且不再读取数据时,如果写端继续向管道写入数据,操作系统会发送一个SIGPIPE信号给写端进程。...默认情况下,这个信号会终止写端进程。SIGPIPE信号是一个用于处理管道写端在写操作时无读端接收的情况的信号。...这是一种保护机制,防止写端进程在没有读端的情况下无限期地等待或继续写入数据到一个不再被读取的管道中。
见一见管道文件 mkfifo函数 输入 man mkfifo 指令 制作一个 FIFOS ,表示命名管道 ---- mkfifo fifo 制作一个管道 ,并命名为 fifo 文件类型以p开头...文件的唯一性,使用路径表示的 让不同的进程通过文件路径+文件名看到同一个文件,并打开,就是看到了同一个资源 3..../fifo";//管道名字为当前路径创建的fifo mode_t mode=0666;//默认权限为0666 这样 server文件和client文件就会调用同一份文件路径了 server.cc 服务端...==0,说明读到文件结尾,当写端关闭时,读端才会读到文件结尾 若返回<0,说明读取失败,则返回错误码 3....buffer<<endl; } else if(n==0)//读到文件结尾为0 { //写端关闭 cout
如下: 而 read 的返回值返回的是读到的数据大小,以字节为单位,当返回值为0时,父进程也就退出了循环,所以我们得出结论,读端正常读,写端关闭,读端就会读到0,表明读到了文件(pipe)结尾,不会被阻塞...命名管道 (1)命名管道的系统接口 上面我们学到的匿名管道是没有名字的,因为打开那个文件的时候并没有告诉我们文件名,也就是管道并没有命名。...我们直接以读方式写方式打开父子进程,各自拿一个读写端就可以通行。正是因为它没有名字,那么所以它必须得让我们对应的父子进程看到通信资源,它采用的是让父子继承的方案看到的。 那么有没有一种其他的方案呢?...我们先看手册的介绍,我们可以在当前的工作目录下建立命名管道: 例如我们在当前目录下创建一个命名管道,名字为 pipefifo: 如上,我们就创建了以 p 属性开头的管道文件,该管道就是命名管道。...我们创建两个终端,两个终端都在当前目录下,一个写,另一个读。观察现象: 如上图,当写端进行写入的时候,命令行会变成一个进程,向管道里写入,此时读端没有读取,所以写端正在阻塞。
, fd[1]表示写端,这是输出型参数,需要由这两个参数找到匿名管道(匿名文件) 默认fd[0]表示读端,fd[1]表示写端 返回值:成功返回0,失败返回错误代码 下面实现一个父进程读数据,然后通过管道让子进程读...3.匿名管道的读写规则 4种情况 管道内部没有数据&&子进程不关闭自己的写端文件fd,读端(富)就要阻塞等待,知道pipe有数据 管道内部被写满&&父进程(读端不关闭自己的fd,写端(子))写满之后,就要阻塞等待...对于写端而言:不写了&&关闭了pipe,读端会将pipe中的数据读完,最后就会读到返回值为0,表示读结束,类似读到了文件的结尾 读端不读&&关闭,写端在写,OS会直接终止写入的进程(子进程),通过信号...在父端写,子端读的情况下子进程的读端为什么都是3? 解释:刚开始父进程3是读端,4是写端,子进程会继承父进程的读写端口。...所以父进程就会分配两个端口给这个管道进行读写,此时的3就被分配给了读端,5分配给了写端 子进程会拷贝父进程的文件描述表,所以3也是子进程的读端,5就是写端。
一般要标定一个文件,是通过文件名来找到指定的文件的,可是当前这个管道文件没有名字,这也的管道文件,叫做匿名文件!...编写代码/实例代码 #include 功能:创建一无名管道 int pipe(int fd[2]); 参数 fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端...这就证明了,如果管道中没有数据,读端在读的时候,默认阻塞当前在读的进程!...)填写的是这个文件的权限,一般为0666....编写代码 先创建2个cpp文件,表示两个没有亲属关系的进程,然后创建1个头文件,用于管道文件的创建。 两个cpp文件:server.cpp用于读取数据,client.cpp用于写入数据。
,读端读完管道内部数据,再读取就会读取到返回值 0,表示对端关闭,也表示读到文件结尾 情况四:管道写端正常 && 读端关闭(OS 会直接杀掉写入进程) 情况二: 如何杀死呢?...当管道满的时候 write 调用阻塞,直到有进程读走数据 调用返回-1,errno值为 EAGAIN 如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭...管道通信的场景 - 进程池 父进程创建多个子进程,并为每个子进程创建一个管道文件,父进程为写端,子进程为读端。父进程给子进程通过管道传输任务,这就是进程池。...<< std::endl; server.ClosePipe(); return 0; } 运行如下: 命名管道-阻塞演示 结论: 读端打开文件的时候,写端还没有打开,读端对用的 open...4.5 命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开
数据操作: Buffer的每一个子类都定义了两类get和put操作。 相对操作:读或写 一个或多个元素 从当前position位置开始并且会根据转换元素数量增加position的值。...将一个Channel中的数据给读到了多个buffer当中,它是按照顺序依次读入buffer当中的,而且总是当当前buffer已经写满了才会写下一个buffer。...还有数据,但缓冲区已经满的情况下,socketChannel.write(buffer)会返回已经写出去的字节数,此时为0。...selector,并且该channel open表示为false的情况下,才会去调用底层套接字的关闭操作。...b) 或者操作channel读/写的当前线程发生中断时。 ? 参考 圣思园netty课程
创建后,这个路径将作为一个特殊类型的文件存在,其类型为p(pipe);如下图所示,在当前路径下创建名为mypipe的管道文件。 写入数据到命名管道 一个进程可以打开命名管道并写入数据。...删除命名管道 一旦不再需要命名管道,可以直接使用rm命令删除它: rm /path/to/your/fifo 记住,命名管道必须在没有任何进程打开的情况下才能被成功删除。...,mode 是管道的权限,一般设置为0600,表示只有拥有者可读可写。...如果先打开Server可执行程序,Client可执行程序还未打开: Server进程会阻塞在打开命名管道文件那里直到Client可执行程序打开 命名管道的打开规则 • 如果当前打开操作是为读⽽打开FIFO...时 ◦ O_NONBLOCK disable(阻塞模式):阻塞直到有相应进程为写⽽打开该FIFO ◦ O_NONBLOCK enable(非阻塞模式):⽴刻返回成功 • 如果当前打开操作是为写⽽打开
pipe(int fd[2]); 参数 fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端 返回值:成功返回0,失败返回错误代码 管道 首先自己要用用户层缓冲区,还得把用户层缓冲区拷贝到管道里...8,子进程拿到的读端fd是3 改变一下,直接从键盘(0号描述符)里读,不从管道(3)里读了,就没有管道的概念了,slaver就不用传参了,父进程通过管道写,子进程通过标准输入读 用到了dup2,将从pipefd...当管道满的时候 O_NONBLOCK disable: write调用阻塞,直到有进程读走数据 O_NONBLOCK enable:调用返回-1,errno值为EAGAIN 如果所有管道写端对应的文件描述符被关闭...命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开...有没有通信呢???
2.1.1 创建匿名管道 使用接口 pipe:创建一个管道,参数为输出型参数,打开两个文件描述符(fd),返回值为0表示打开失败。...当管道满的时候 O_NONBLOCK disable: write调用阻塞,直到有进程读走数据 O_NONBLOCK enable:调用返回-1,errno值为EAGAIN 如果所有管道写端对应的文件描述符被关闭...即匿名管道的四种情况: 读端不读或读的慢,写端要等读端 读端关闭,写端收到SIGPIPE信号直接终止 写端不写或者写的慢,读端要等写端 写端关闭,读端会读完管道内的数据然后再读,...会读到0,表示读道文件结尾 2.2....命名管道有名字是为了保证让不同进程看到同一个文件。 匿名管道没有名字,是因为他是通过父子继承放入方式,看到同一份资源不需要名字。
所以根据传输方向的需要,关闭没有用的文件描述符。 问:为什么让父进程分别以读和写的方式打开同一个文件。 答:为了满足通信,通信双方会分别以读和写的方式打开同一个文件。...结论:当管道中没有数据时,且写端没有关闭写文件描述符时,读端会一直阻塞等待,直到写端有数据写入。 情况3 写端正常写入,读端每10秒钟读取一次数据。当管道被写满时,写端在做什么?...情况4 读端正常读取,写端在写入过程中突然将写文件描述符关闭 总结:当写端不再写入,并且关闭了pipe,那么读端将会把管道内的内容读完,最后就会读到返回值为0,表示读取结束,类似于读到了文件的结尾。...有没有一种能用于没有血缘关系的进程间的通信呢?有,命名管道。...,所以底层作为重定向是没问题的; 紧接着我们就尝试去写了,但当前呢它卡在这里的,什么都没做,我们再看一下当前这个管道文件里,当前显示的是零,好像没有写入啊; 这是因为管道文件有种特殊特性,虽然在磁盘当中创建了这个
功能: 创建一无名管道 参数: fd:文件描述符数组,是一个输出型参数,拿到打开的管道文件的问文件描述符,其中fd[0]表示读端文件,fd[1]表示写端文件 返回值:成功返回0,失败返回错误代码...:read调用返回-1,errno值为EAGAIN 写端不写,并将写端文件关闭 如果所有管道写端对应的文件描述符被关闭,则read返回0 读端不读,写端一直写 O_NONBLOCK disable...: write调用阻塞,直到有进程读走管道缓冲区的数据 O_NONBLOCK enable: write调用返回-1,errno值为EAGAIN 读端不读,并将读端文件关闭 如果所有管道读端对应的文件描述符被关闭...FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义 命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK...disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为读而打开该
,父进程以读写打开,子进程也是以读写打开(一般而言,管道只用来进行单向数据通信);关闭父子进程不需要的文件描述符,完成通信: 管道分为匿名管道和命名管道 2.2匿名管道 我们通过文件名区分文件,但是如果当前进程的文件没有名字...,读端在读,默认会直接阻塞当前正在读取的进程 ssize_t s = read(fds[0],buffer,sizeof(buffer)-1); if(s>0) buffer...子进程休眠时,不在写入,父进程在读取(如果管道中没有数据,读端在读,此时默认会直接阻塞当前正在读取的进程) 2.读慢写快 拿着管道读端不读,写端一直在写:写端往管道里写,而管道是有大小的,不断往写端写...3.写入关闭,读到0 子进程写入端关闭: 4.读取关闭,写入 管道是单向的:读端关闭,在写入就没有意义了:OS会终止写端,会给写进程发送信号,终止写端 管道特征 1.管道的生命周期随进程,进程退出...在当前路径下直接创建命名管道: mkfifo named_pipe 往管道文件写东西: 两个进程打开同一个文件:站在内核的角度,第二个文件不需要继续创建struct file对象,因为OS会识别到打开的文件被打开了
[0] 管道读端文件描述符 pipefd[1] 管道写端文件描述符 匿名管道的使用: 注意下图中的fd均指pipefd。...3.假设我们让子进程写,父进程读,所以我们要关闭不用的文件描述符,父进程关闭写端,子进程关闭读端。 ...(id,NULL,0);//父进程等待子进程,并回收 return 0; } 来看看运行结果: 管道的4种情况: 1.写端进程不写,读端进程一直读,那么此时会因为管道里面没有数据可读,对应的读端进程会被挂起...从上图可以算出管道的大小为512*8 = 4096字节。 命名管道: 刚才介绍的匿名管道,只可用于父子进程间通信,如果两个毫不相干的进程要实现通信该怎么办呢?接下来就需要介绍一下命名管道了。...mkfifo函数: mkfifo函数用于创建一个命名管道。 mkfifo的第一个参数表示要创建的命令管道文件,如果不带路径默认再当前文件夹下。 mkfifo的第二个参数表示管道的文件权限。
MySQL 间隙锁有没有了解,死锁有没有了解,写一段会造成死锁的 sql 语句,死锁发生了如何解决,MySQL 有没有提供什么机制去解决死锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。...锁的分类 从对数据操作的类型分类: 读锁(共享锁):针对同一份数据,多个读操作可以同时进行,不会互相影响 写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁 从对数据操作的粒度分类...):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求; 表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作; MyISAM 表的读操作与写操作之间,...默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列中等候的获取锁请求。...参数,表示记录下没有使用索引的查询。
所有新数据加入到 buffer pool的时候,一律先放到冷数据区的head,不管是预读的,还是普通的读操作。所以如果有一些预读的数据没有被用到,会在oldsublist (冷区)直接被淘汰。...OK,预读的问题,通过冷热分离解决了,还有没有其他的问题呢? 我们先把数据放到冷区,用来避免占用热数据的存储空间。...否则的话就需要从磁盘加载到内存,再对内存的数据页进行操作。也就是说,如果没有命中缓冲池,至少要产生一次磁盘IO,有没有优化的方式呢?...3、双写缓冲(InnoDB的一大特性)∶InnoDB的页和操作系统的页大小不一致,InnoDB页大小一般为16K,操作系统页大小为4K,InnoDB的页写入到磁盘时,一个页需要分4次写。...跟redo log不一样,它的文件内容是可以追加的,没有固定大小限制。 在开启了binlog 功能的情况下,我们可以把 binlog 导出成SQL语句,把所有的操作重放一遍,来实现数据的恢复。
简单的来说,cat trace_pipe是堵塞读取,有数据就读,没数据就等待;而cat trace有没有数据都是直接返回的 3.3.3 tracing_on tracing_on:向 tracing_on...3.3.6 available_tracers available_tracers 文件中包含的是当前编译到内核的 tracer 列表,也表示当前内核支持的tracer列表。...per_cpu/cpuX/buffer_size_kb 记录 每个CPU buffer 大小,单位为 KB 。可通过写 buffer_size_kb 来改变 CPU buffer 的大小。...因为ftrace当打开时,在没有过滤的情况下,瞬间会抓取到内核所有的函数调用,为了更准确的抓取我们执行的命令,所以需要打开trace,执行完命令后,马上关闭。...如果函数命名没有规律,又想过滤该模块所有函数,该怎么办?
如果cache中没有请求的数据,即cache未命中(cache miss),就必须从磁盘中读取数据。然后内核将读取的数据缓存到cache中,这样后续的读请求就可以命中cache了。...page可以只缓存一个文件部分的内容,不需要把整个文件都缓存进来。 写Cache 当内核发起一个写请求时(例如进程发起write()请求),同样是直接往cache中写入,后备存储中的内容不会直接更新。...writepage() 函数 对于文件映射(host指向一个inode对象),page每次修改后都会调用SetPageDirty(page)将page标识为dirty。...(对从用户空间拷贝到内核空间不是很理解,后期会重点学习Linux读、写文件的详细过程然后写一篇详细的blog介绍) Buffer Cache 在Block I/O的文章中提到用于表示内存到磁盘映射的buffer_head...在Linux2.4中,buffer cache和 page cache之间是独立的,前者使用老版本的buffer_head进行存储,这导致了一个磁盘block可能在两个cache中同时存在,造成了内存的浪费
,2-3表示WriteBuffer的Index,4-5是TempBuffer的Index,而6表示当前TempBuffer是否为Dirty,当有新写入新的数据后就会把这里Dirty位置为true,如果是...那么06按照这个格式来表示,就是指Temp Index为0,Write Index为1,而Read Index为2,因此,初始化状态指向的Buffer如下图所示。...如下图所示 检测之后如果为true,我们肯定是希望把已经写好的Buffer交换到ReadIndex上,而如果没有写好的Buffer就说明没有新内容可以读,就什么都不做。...可以看到下面这样的log,很多写入值没有读,证明了读过慢的问题: 那有没有办法解决这样的问题呢?先看写过慢读多次同样数据的问题。...其实我们看前面TripleBuffer源码知道dirty表示有没有新数据可以读,我们自己代码在读的地方我们没有管是否为dirty就直接读,那么必然会读到多次同样的数据,所以可以改为判断dirty,只要不是读过慢的情况下影就能解决多次读的问题
MySQL 间隙锁有没有了解,死锁有没有了解,写一段会造成死锁的 sql 语句,死锁发生了如何解决,MySQL 有没有提供什么机制去解决死锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。...锁的分类 从对数据操作的类型分类: 读锁(共享锁):针对同一份数据,多个读操作可以同时进行,不会互相影响 写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁 从对数据操作的粒度分类: 为了尽可能提高数据库的并发度...):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求; 表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作; MyISAM 表的读操作与写操作之间,以及写操作之间是串行的...默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列中等候的获取锁请求。...参数,表示记录下没有使用索引的查询。
领取专属 10元无门槛券
手把手带您无忧上云