【问题标题】:Does the size of a long equal to the size of a wordlong的大小是否等于单词的大小
【发布时间】:2014-01-07 14:23:43
【问题描述】:

您好,我正在 Linux 下编程(使用 C 语言)。

当我使用 ptrace() 读取数据时,它会返回一个单词。 在所有示例中,我看到人们使用 long 来读取输入。 Long 是否总是具有相同大小的单词? 我知道一个词是处理器处理数据的自然大小(寄存器大小)。但这是否也适用于不同架构上的 long 等?

 OValue_t outputValue;
 //.su_word is a long
 outputValue.su_word = ptrace(PTRACE_PEEKDATA,Process.ProcId,address,0); 
 printf("word  : %ld\n", outputValue.su_word);
 printf("int8 : %i\n", outputValue.su_int8);

编辑:感谢 Krzysztof Kosiński/unwind 和 Jonathan Leffler here 的回答,我知道 ptrace 返回一个 long 并且 long 足以容纳一个词。

http://docs.oracle.com/cd/E19620-01/805-3024/lp64-1/index.html

【问题讨论】:

    标签: c linux word long-integer ptrace


    【解决方案1】:

    示例使用long,因为function is documented 就是这样工作的,原型是:

    long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
    

    手册页中甚至有一条注释说:

    “字”的大小由操作系统变体决定(例如,对于 32 位 Linux,它是 32 位)。

    我认为它也被声明为返回int,因为int 应该是平台的“自然”整数大小,我认为这是典型情况下该平台的“字大小”。

    该函数确实假定long 比“一个词”具有更高的精度,据我从手册页中可以看出。它使用返回值 -1 来表示错误,但由于它当然也可以是有效值,因此还需要检查 errno

    【讨论】:

    • 谢谢,但是在手册中它说“在地址读取一个单词”,那么他们怎么能假设 long 足以在不同的平台上存储一个单词呢?
    • int 不等于 x86-64 和大多数其他 64 位系统上的字长。
    【解决方案2】:

    Linux API 将ptrace 定义为始终返回long

    long ptrace(enum __ptrace_request request, pid_t pid,
                void *addr, void *data);
    

    在 Linux 上,long 的大小等于机器字长(32 位机器上为 32 位,64 位机器上为 64 位,等等)。据我所知,在所有具有 Linux 端口的主要架构上都是如此。

    请注意,这在 Windows 上并非如此,其中 long 即使在 x64 上也是 32 位 - 但由于 ptrace 是特定于 Linux 的调用,因此您不必担心。

    【讨论】:

      【解决方案3】:

      唯一的规则是 long 必须至少word (int) 的大小。除此之外,这取决于机器架构和编译器编写者。您可以合法地拥有 char = short = int = long = long long。

      【讨论】:

      • int 没有定义为等于字长,只是建议它应该是最快的可用整数类型。实际上,int 即使在 64 位机器上也是 32 位的,这意味着它小于字长。
      猜你喜欢
      • 1970-01-01
      • 2013-11-11
      • 2019-12-12
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多