【问题标题】:GCC declarations: typedef __pid_t pid_t?GCC 声明:typedef __pid_t pid_t?
【发布时间】:2014-07-20 04:34:29
【问题描述】:

我对(例如)pid_t 的声明感到困惑。 __pid_t 是什么意思?它是在别处定义的另一种类型吗?如果是,在哪里?为什么我在 ubuntu 13.04 64bit 中的 types.h 定义 pid_t 如下:

#ifndef __pid_t_defined
typedef __pid_t pid_t;
#define __pid_t_defined
#endif

而不是像

typedef int pid_t;

我看到一些网站的 types.h 标头具有最后一种方式的声明。这是一: http://www.sde.cs.titech.ac.jp/~gondow/dwarf2-xml/HTML-rxref/app/gcc-3.3.2/lib/gcc-lib/sparc-sun-solaris2.8/3.3.2/include/sys/types.h.html

更新:

好的,我发现 pid_t 是一个 __pid_t,它是一个 __PID_T_TYPE,它是一个 __S32_TYPE,它是一个 int。我现在的问题是为什么会这样? POSIX 只声明 pid_t 必须是有符号整数,那么为什么要让声明在头文件中输入这么深呢?

【问题讨论】:

    标签: unix gcc fork


    【解决方案1】:

    如果您通过“man types”提取types.h,那么在头文件的顶部(在手册页中的描述下)应该存在一个包含文件,该文件在某些​​时候将'__pid_t' 定义为已签名整数(如果 Ubuntu 声称它们的类型是 POSIX 兼容的;否则 pid_t 可以是任何东西)。符号' __' 被认为是保留的(C 标准,不知道关于 C++)。如果我不得不大胆猜测为什么 pid_t 被定义为 __pid_t 而不是一些 int 是因为 __pid_t 是 Debian 或 Linux 内核的开发人员决定在他们的所有进程中使用的进程 ID 变量名库函数;因此只需更改 '__pid_t' 即可更改进程 ID 的整数大小。

    在提问之前你真的应该四处看看,类似的 stackoverflow 问题很容易找到:Size of pid_t, uid_t, gid_t on Linux

    【讨论】:

    • 为什么内核开发人员决定这样做呢?你给我的链接是题外话
    【解决方案2】:

    好的,我在这个问题的答案中找到了 __pid_t 的含义: Why PID of a process is represented by opaque data type?

    报价

    typedef __pid_t pid_t;
    ...
    # define __STD_TYPE     typedef
    __STD_TYPE __PID_T_TYPE __pid_t;    /* Type of process identifications.  */
    ...
    #define __PID_T_TYPE        __S32_TYPE
    ...
    #define __S32_TYPE      int
    

    取消引用

    所以 pid_t 是一个 __pid_t,它是一个 __PID_T_TYPE,它是一个 __S32_TYPE,它是一个 int。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多