您好我在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
答案 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。