#define __REDIRECT_NTH在unistd.h中做了什么?

时间:2010-12-19 02:21:24

标签: c unistd.h

GNU unistd.h有一点魔力:

/* Move FD's file position to OFFSET bytes from the
   beginning of the file (if WHENCE is SEEK_SET),
   the current position (if WHENCE is SEEK_CUR),
   or the end of the file (if WHENCE is SEEK_END).
   Return the new file position.  */
#ifndef __USE_FILE_OFFSET64
extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW;                                                                    
#else
# ifdef __REDIRECT_NTH
extern __off64_t __REDIRECT_NTH (lseek,
                              (int __fd, __off64_t __offset, int __whence),
                               lseek64);                                                                                                    
# else
#  define lseek lseek64
# endif
#endif
#ifdef __USE_LARGEFILE64
extern __off64_t lseek64 (int __fd, __off64_t __offset, int __whence) __THROW;                                                              
#endif

__REDIRECT_NTH是什么意思?

3 个答案:

答案 0 :(得分:5)

关于REDIRECT_NTH含义的更多细节:宏生成一个函数声明,告诉编译器在编译器的ELF输出中使用特定符号作为函数。默认情况下,编译器将ELF符号“lseek”用于名为“lseek”的C函数(或者,在某些系统上使用“_lseek”)。此宏扩展为代码,告诉编译器使用符号“lseek64”。所以C代码有一个名为“lseek”的函数,但当你查看目标代码(例如程序'nm')时,你会看到“lseek64”。

这样做的目的是该函数实际上是二进制级别的lseek64 - 它处理64位文件偏移。但源代码已声明它要调用它lseek,原因是出于向后兼容性原因(这就是_FILE_OFFSET_BITS=64所说的内容)。

如果源程序想要按该名称调用lseek64,并且lseek引用旧的32位版本,则必须定义_LARGEFILE64_SOURCE而不是_FILE_OFFSET_BITS=64

顺便说一下,“REDIRECT_NTH”中的“NTH”是指“no throw”,它是宏生成的函数声明的属性。

答案 1 :(得分:2)

它是为实现保留的命名空间中的宏。它只出现在您的平台上;它会在您的平台上执行任何适当的操作,因为实现确定它是正确的。

如果您无法轻易找到,您可能不应该直接使用它。即使你能找到答案,也很有可能你不应该直接使用它。

也就是说,它似乎安排将lseek()的调用转换为lseek64(),可能是为了在32位计算机上提供对大文件(大于2 GiB)的支持(或者在64位计算机上的32位系统API下。)

答案 2 :(得分:0)

永远不要触摸大文件黑客攻击。始终在-D_FILE_OFFSET_BITS=64中加入CFLAGS,您永远不会出错。