5

应该不难吧?对?

我目前正在搜索 OpenAFS 代码库以查找 pioctl 的标头定义。我已经抛出了我所拥有的一切:检查 ctags,grepped pioctl 的源代码等。我最接近线索的是有一个文件 pioctl_nt.h 包含定义,除了它是实际上不是我想要的,因为没有任何用户空间代码直接包含它,而且它是特定于 Windows 的。

现在,我不希望您去下载 OpenAFS 代码库并为我找到头文件。不过,我很好奇:当其他一切都失败时,您有什么技术可以找到所需的头文件?哪些最坏的情况可能导致代码库中的 grep for pioctl 实际上没有提出任何看起来像函数定义的东西?

我还应该注意,我可以访问两个独立的用户空间程序,它们已经正确完成,所以理论上我可以对函数进行 O(n) 搜索。但是没有一个头文件弹出给我,而且 n 很大......

编辑:直接的问题已经解决: pioctl() 是隐式定义的,如下所示:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
4

6 回答 6

4

如果grep -r并且ctags失败了,那么它可能被定义为一些讨厌的宏的结果。您可以尝试制作最简单的文件以成功调用pioctl()和编译,然后对其进行预处理以查看会发生什么:

gcc -E test.c -o test.i
grep pioctl -C10 test.i
于 2009-05-03T05:20:16.143 回答
2

有编译器选项可以显示预处理器输出。试试那些?在我脑子里完全没有任何可能的定义的可怕时刻,-E 选项(在大多数 c 编译器中)除了喷出预处理的代码外什么也没做。

根据请求的信息:通常我只是捕获有问题的文件的编译,因为它在屏幕上输出,然后快速复制和粘贴并在编译器调用之后放置 -E。结果会将预处理器输出喷到屏幕上,因此将其重定向到文件。浏览该文件,因为所有的宏和愚蠢的事情都已经处理好了。

最坏的情况:

  • K&R 风格原型
  • 宏隐藏了定义
  • 隐式声明(根据您的回答)
于 2009-05-03T05:11:52.903 回答
1

您是否考虑过使用cscope(可从SourceForge获得)?

我在一些相当重要的代码集(25,000+ 个文件,一个文件中最多约 20,000 行)上使用它并取得了很好的成功。在古代 Sun E450 上构建交叉引用需要一段时间(5-10 分钟)和更长的时间(20-30 分钟),但我发现结果很有用。


在几乎同样古老的 Mac(双 1GHz PPC 32 位处理器)上,在 OpenAFS (1.5.59) 源代码上运行的 cscope 出现了很多声明函数的地方,有时在代码中内联,有时在标头中. 扫描 4949 个文件需要几分钟,生成一个 58 MB 的 cscope.out 文件。

  • openafs-1.5.59/src/sys/sys_prototypes.h
  • openafs-1.5.59/src/aklog/aklog_main.c(连同评论“为什么 AFS 不提供这些原型?”)
  • openafs-1.5.59/src/sys/pioctl_nt.h
  • openafs-1.5.59/src/auth/ktc.c 包括对 PIOCTL 的定义
  • openafs-1.5.59/src/sys/pioctl_nt.c 提供了它的实现
  • openafs-1.5.59/src/sys/rmtsysc.c 提供了它的实现(有时是 afs_pioctl() )

发现的 184 个实例中的其余部分似乎是函数的使用、文档参考、发行说明、更改日志等。

于 2009-05-03T05:24:29.583 回答
0

我们决定的当前工作理论,在戳了预处理器并且也没有找到任何东西之后,是 OpenAFS 让编译器推断函数的原型,因为它返回一个整数并接受指针、整数、指针、整数作为它的参数。我将通过自己定义来处理这个问题。

编辑:太棒了!我找到了确凿的证据:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
于 2009-05-03T05:34:21.273 回答
0

虽然最初的一般问题已得到解答,但如果有人到达此页面想知道在哪里可以找到定义 pioctl 的头文件:

在当前版本的 OpenAFS (1.6.7) 中,pioctl 的原型在 sys_prototypes.h 中定义。但是在最初提出这个问题的时候,那个文件并不存在,并且在 OpenAFS 代码树之外没有可见的 pioctl 原型。

但是,大多数 pioctl 用户可能想要或者至少可以使用 lpioctl(“本地” pioctl),它总是在本地机器上发出系统调用。在 afssyscalls.h 中有一个原型(现在还有 sys_prototypes.h)。

不过,如今最简单的选择就是使用 libkopenafs。为此,包括 kopenafs.h,使用函数 k_pioctl,并链接到 -lkopenafs。这往往是一个比尝试与 OpenAFS libsys 和其他东西链接更方便的界面。

于 2014-05-10T19:44:25.143 回答
-1

通常不是在手册页概要中说吗?

于 2009-05-03T05:26:22.667 回答