2014-01-07 37 views
1

你好,我在Linux下编程(在C)。长的大小等于一个字的大小

当我使用ptrace()读取数据时,它返回一个单词。 在所有的例子中,我看到人们用很长的时间来阅读输入。 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); 

编辑:感谢克日什托夫·科辛斯基/放松和乔纳森·莱弗勒here答案我的理解是ptrace的返回长和长是一个字够大。

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

回答

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

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

+0

谢谢,但在手册中写着'在地址处读一个字',那么他们如何能够假设一个长的字足够大以便在不同的平台上存储一个字? – Jona

+0

http://stackoverflow.com/questions/589575/size-of-int-long-etc乔纳森的回答给了我答案 – Jona

+1

“int”不等于x86-64和大多数其他64位系统的字大小。 –

-2

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

+1

'int'没有被定义为等于字的大小,只有建议它应该是最快的可用整数类型。实际上,即使在64位机器上,“int”也是32位,这意味着它小于字的大小。 –

相关问题