长度的大小是否等于单词的大小

时间:2014-01-07 14:23:43

标签: c linux word long-integer ptrace

您好我在Linux下编程(在C中)。

当我使用ptrace()读取数据时,它会返回一个单词。 在所有示例中,我看到人们使用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);
编辑:感谢KrzysztofKosiński/放松和Jonathan Leffler的回答here我明白ptrace会返回一个很长很长的长度足够一个字。

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

3 个答案:

答案 0 :(得分:4)

示例使用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

答案 1 :(得分:3)

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上并非如此,即使在x64上long为32位 - 但由于ptrace是特定于Linux的调用,因此您不必担心它。

答案 2 :(得分:-2)

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