【问题标题】:why does the kill function man page shows two header sys/types.h and signal.h为什么 kill 函数手册页显示两个标题 sys/types.h 和 signal.h
【发布时间】:2020-12-09 16:26:00
【问题描述】:

man 2 kill - C 中 kill 函数的手册页 在 SYNOPSIS 中显示两个头文件 -

  1. #include
  2. #include

当我在我的 c 程序中使用 kill 函数时,它被 only including the signal.h file 完美编译。
包含synopsis 中提到的所有#include 重要吗?
上面kill里面sys/types.h的目的是什么?

【问题讨论】:

  • 很久以前,POSIX 说需要<sys/types.h>,尽管 X/Open 标准和它所基于的 SVID 不需要它——大多数实际实现都需要它也不需要它(实际上,它是自动包含的)。十多年来,即使在 Linux 上也不需要#include <sys/types.h>,但手册没有改变。那不是官方立场。不过,这是一个事实上的观察结果。
  • POSIX 1997:kill() — 也需要 <sys/types.h>。相比之下,POSIX 2004:kill() — 不需要 <sys/types.h>

标签: c header-files manpage


【解决方案1】:

您可以包含sys/types.h 以使用pid_t,这是可选的。但是signal.h 允许你使用kill(和其他函数)、信号常量等。所以#include <signal.h> 是必须使用kill

【讨论】:

  • "本机 Linux 系统调用,因此您不需要任何包含即可使用它。"是错误和坏的建议。首先是因为您正在调用库函数kill 而不是直接调用系统调用,其次是因为在没有原型的情况下调用 C89 中的函数会导致该函数的隐式声明(作为一个函数采用一些未指定数量的 args,返回 int)。现代编译器会警告您不要这样做(因为这可能不是您的意思,并且可能会导致非常不幸的意外)。
  • @Hasturkun 感谢您的回复,已编辑答案以使其正确
  • 但是当你打开一个 c 函数的手册页时,它可能会在概要中列出 4 个头文件。我们将如何找出使用哪一个?就像上面你说的那样,使用 pid_t 时需要 types.h 因为我的代码没有使用它,所以我不需要它。一般的做法是什么?如果我想使用一个函数,我应该默认包含概要中提到的所有头文件吗?这是一种好的编码习惯吗?
  • 是的,您也可以只包括所有这些。这样做并没有真正的危害。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 2014-05-01
  • 2012-08-03
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多