linux文件主要有4种:普通文件、目录文件、设备文件(字符设备文件/块设备文件)、管道文件
管道文件(p表示管道文件)
[redhat@localhost tmp]$ mkfifo fifo
[redhat@localhost tmp]$ ll fifo
prw-rw-r--. 1 redhat redhat 0 7月 1 22:06 fifo
文件系统(ext4/ext3/nfs)中存在管道文件,所以就通过文件名称来标识管道文件及其关联的管道FIFO;所以有名管道就可以在非亲子关系的进程间实现通信,一个进程通过文件名打开管道的写端,另一个进程通过文件名打开管道的读端,两个进程就可以通过该FIFO实现通信。
I.def_fifo_fops
def_fifo_fops表示管道文件的操作集,定义如下:
/* fs/fifo.c */
148 /*
149 * Dummy default file-operations: the only thing this does
150 * is contain the open that then fills in the correct operations
151 * depending on the access mode of the file...
152 */
153 const struct file_operations def_fifo_fops = {
154 .open = fifo_open, /* will set read_ or write_pipefifo_fops */
155 };
当打开管道文件时会触发def_fifo_fops中的open方法fifo_open,代码跟踪如下:
文件方法集:
open->do_sys_open->do_filp_open->path_lookup_open->do_path_lookup->path_walk->link_path_walk->__link_path_walk->do_lookup->real_lookup
ext4为例:
ext4_lookup->ext4_iget->init_special_inode->def_fifo_fops
open回调:
open->do_sys_open->do_filp_open->nameidata_to_filp->__dentry_open->fifo_open
II.fifo_open
18 static void wait_for_partner(struct inode* inode, unsigned int *cnt)
19 {
20