Linux pipe 原始碼分析

2021-06-29 06:14:40 字數 2266 閱讀 4523

linux pipe 原始碼分析

管道pipe作為unix中歷史最悠久的ipc機制,存在各個版本的unix中,主要用於父子程序之間的通訊(使用fork,從而子程序會獲得父程序的開啟檔案表),pipe()系統呼叫底層的實現就相當於乙個特殊的檔案系統,每次呼叫的時候建立乙個inode關聯著兩個file,乙個用於讀,乙個用於寫,從而實現資料的單向流動。

使用者層api:

#include int pipe(int pipefd[2]);

#define _gnu_source /* see feature_test_macros(7) */

#include int pipe2(int pipefd[2], int flags);

核心原始碼路徑如下:

// sys_pipe(.......)

syscall_define1(pipe, int __user *, fildes)

syscall_define2(pipe2, int __user *, fildes, int, flags)

else

}return error;

}static int __do_pipe_flags(int *fd, struct file **files, int flags)

/** 為管道建立兩個file例項

*/int create_pipe_files(struct file **res, int flags)

; // quick string ??

if (!inode)

return -enfile;

err = -enomem;

// 分配乙個directory entry

path.dentry = d_alloc_pseudo(pipe_mnt->mnt_sb, &name);

if (!path.dentry)

goto err_inode;

path.mnt = mntget(pipe_mnt); // 引用計數加1

d_instantiate(path.dentry, inode);

err = -enfile;

f = alloc_file(&path, fmode_write, &pipefifo_fops);

if (is_err(f))

goto err_dentry;

f->f_flags = o_wronly | (flags & (o_nonblock | o_direct));

f->private_data = inode->i_pipe;

// 所以你會明白 fd[0]是讀 fd[1]是寫

res[0] = alloc_file(&path, fmode_read, &pipefifo_fops);

if (is_err(res[0]))

goto err_file;

path_get(&path);

res[0]->private_data = inode->i_pipe;

res[0]->f_flags = o_rdonly | (flags & o_nonblock);

res[1] = f;

return 0;

err_file:

put_filp(f);

err_dentry:

free_pipe_info(inode->i_pipe);

path_put(&path);

return err;

err_inode:

free_pipe_info(inode->i_pipe);

iput(inode);

return err;

}static struct inode * get_pipe_inode(void)

// 針對pipe的檔案操作例項

const struct file_operations pipefifo_fops = ;

整體的邏輯圖可以這樣:

todo:具體讀寫的實現細節new_sync_read/write()有待分析。

參考:(1)linux kernel 3.18 source code 

(2)linux man page

(3)linux核心原始碼情景分析

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...