Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何从Linux内核空间访问系统中的所有管道_File_Linux Kernel_Pipe_Inode_System Calls - Fatal编程技术网

File 如何从Linux内核空间访问系统中的所有管道

File 如何从Linux内核空间访问系统中的所有管道,file,linux-kernel,pipe,inode,system-calls,File,Linux Kernel,Pipe,Inode,System Calls,我想向Linux内核添加一个新的系统调用,该调用将显示有关在系统中创建的所有管道的信息 如何获取pipefs中每个管道的inode(或允许我访问管道inode\u信息的任何其他相关结构)? 我一直在看,但是我没有找到正确的方法是否有任何方法可以获取pipefs中每个文件的文件结构?首先,我转到/proc目录,然后讨论以下问题: ls -al */fd |grep pipe (试着去掉上面的“管道”,你会学到更多。)结果是(只是一个快照): 如果您想查看创建管道的流程,只需删除“grep”,例如

我想向Linux内核添加一个新的系统调用,该调用将显示有关在系统中创建的所有管道的信息

如何获取pipefs中每个管道的inode(或允许我访问管道inode\u信息的任何其他相关结构)?


我一直在看,但是我没有找到正确的方法是否有任何方法可以获取pipefs中每个文件的文件结构?

首先,我转到/proc目录,然后讨论以下问题:

ls -al */fd |grep pipe
(试着去掉上面的“管道”,你会学到更多。)结果是(只是一个快照):

如果您想查看创建管道的流程,只需删除“grep”,例如:

此处显示pid=1在6759处具有管道fd:

1/fd:
total 0
dr-x------ 2 root root  0 2011-05-14 23:29 .
dr-xr-xr-x 7 root root  0 2011-05-14 22:59 ..
lrwx------ 1 root root 64 2011-05-14 23:29 0 -> /dev/console (deleted)
lrwx------ 1 root root 64 2011-05-14 23:29 1 -> /dev/console (deleted)
lrwx------ 1 root root 64 2011-05-14 23:29 2 -> /dev/console (deleted)
lr-x------ 1 root root 64 2011-05-14 23:29 3 -> pipe:[6759]
并将上述内容追溯到fs/pipe.c(打印这些文件的linux内核源代码):

阅读fs/dcache.c:

char *d_path(const struct path *path, char *buf, int buflen)
{
        if (path->dentry->d_op && path->dentry->d_op->d_dname)
                return path->dentry->d_op->d_dname(path->dentry, buf, buflen);

and since d_path() is an exported symbol,

EXPORT_SYMBOL(d_path);
您应该能够从任何地方调用它,并派生有关路径的信息-如果它是管道,则将调用相应的pipefs_dname()-它依赖于文件系统:

./fs/pipe.c:
    .d_dname    = pipefs_dname,
阅读inode.c:init_inode_always(),可以看到i_管道被设置为NULL。仅当inode是管道时,它才不是null

因此,您可以始终循环所有进程并获取其打开的文件描述符,如果inode的i_管道设置为非NULL,您将知道该值是管道的inode编号

我不认为这样的代码会存在于内核源代码中(因此没有必要去寻找它——我已经尝试过了),因为在用户空间(如我前面解释的“ls-al”命令)中这样做比在内核内部更有效、更安全——通常内核越小,安全性缺陷越小,稳定性越好等等

char *d_path(const struct path *path, char *buf, int buflen)
{
        if (path->dentry->d_op && path->dentry->d_op->d_dname)
                return path->dentry->d_op->d_dname(path->dentry, buf, buflen);

and since d_path() is an exported symbol,

EXPORT_SYMBOL(d_path);
./fs/pipe.c:
    .d_dname    = pipefs_dname,