Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
我不能';我在Linux内核中找不到proc_create_data函数的定义,或者我找到了它,但没有理解它_C_Linux_Linux Kernel - Fatal编程技术网

我不能';我在Linux内核中找不到proc_create_data函数的定义,或者我找到了它,但没有理解它

我不能';我在Linux内核中找不到proc_create_data函数的定义,或者我找到了它,但没有理解它,c,linux,linux-kernel,C,Linux,Linux Kernel,形势 为了更好地理解Linux内核,我将遵循以下步骤 这里有一个编写自定义/proc接口的示例。下面是上面链接的示例代码片段-custom proc.c: #包括 #包括 #包括 #包括 #包括 #包括 #在C语言中,宏将被文本扩展,人们可以像函数一样使用它 如果我在这里应用它,那么在所有的扩展之后,我将 /include/linux/proc_fs.h: #省略 外部结构proc_dir_项({NULL;}) custom proc.c #省略 proc=({NULL;}) 我觉得这不太对

形势

为了更好地理解Linux内核,我将遵循以下步骤

这里有一个编写自定义/proc接口的示例。下面是上面链接的示例代码片段-
custom proc.c

#包括
#包括
#包括
#包括
#包括
#包括
#在C语言中,宏将被文本扩展,人们可以像函数一样使用它

如果我在这里应用它,那么在所有的扩展之后,我将

/include/linux/proc_fs.h

#省略
外部结构proc_dir_项({NULL;})
custom proc.c

#省略
proc=({NULL;})
我觉得这不太对

我对编程并不陌生,但对C不熟悉。我阅读了Brian W.Kernighan和Dennis m.Ritchie的《C编程语言》
,但对宏的解释与上面的链接相同

问题(主菜:)

如何理解内核中定义的
proc\u create\u data
函数

我不是在寻找一个非常详细的技术答案,只是一种解释代码的方法,这样我就可以按照示例进行操作,并能够在需要时阅读更多的内核代码

配菜 我在某处听说,尽管内核是用C编写的,但它与“普通”C有一些不同。不过,我不确定这是真的还是差异的程度

如果这是“C语言的内核版本”所使用的技巧,那么如果有人知道这些技巧的解释链接,这将是很有帮助的

我已经查看了以下资源,但找不到此类信息:

  • Linux内核开发-Robert Love
  • Linux系统编程-Robert Love
在以下情况下看起来是这样的:

如果是用户,则函数调用将扩展为仅返回
NULL
的语句。请注意,
({…})
是一个-不要在代码中使用不可移植的扩展,而更喜欢使用
静态内联
函数。语句表达式的返回值是使用的最后一个表达式的值-
NULL

如果从用户配置中定义了
CONFIG\u PROC\u FS
,则
PROC/generic.c
与任何其他函数一样定义函数,包括
PROC\u FS.h
在内的源文件参见函数声明,而不查看宏

我在Linux内核中找不到proc_create_数据函数的定义

无需担心-导致本答案中提到的所有3个定义。网络上甚至有多个索引内核源代码浏览器,举个例子(但我现在在lxr上看到了内部错误)。如果没有,您可以使用或为计算机上的源代码编制索引,然后浏览代码

如何理解内核中定义的proc_create_data函数

与任何其他功能一样。否,宏不使用声明展开-编译器会看到宏或函数声明,具体取决于是否启用了
PROC\u FS

我在某处听说,尽管内核是用C编写的,但它与“普通”C有一些不同


Linux内核专门针对GNU GCC编译器,所以它倾向于使用,有时标记为GNU C。

#省略
部分非常重要……我看到你正在编辑,所以我不想弄乱你的帖子:你应该链接到第102行的
proc#u create_data
,并且在链接中使用
v5.9.1
而不是
最新的
,否则它们将来会断开。不用担心-一切都好:pThanks@KamilCuk。像你这样的人就像内核领域的奇才,没有他们,像我这样的用户领域居民就无法进入内核。
#ifdef CONFIG_PROC_FS
extern struct proc_dir_entry *proc_create_data(const char *, umode_t,
                           struct proc_dir_entry *,
                           const struct proc_ops *,
                           void *);
#else /* CONFIG_PROC_FS */
#define proc_create_data(name, mode, parent, proc_ops, data) ({NULL;})
#endif