glibc中关于truncate的函数有4个,它们分别是truncate,ftruncate,truncate64,ftruncate64。
truncate和ftruncate可以截断文件为32位长度,truncate64和ftruncate64可以截断文件为64位长度。
truncate函数的源码在sysdeps/unix/sysv/linux/truncate.c文件中。
int
__truncate (const char *path, off_t length)
{
return INLINE_SYSCALL_CALL (truncate, path, length);
}
weak_alias (__truncate, truncate)
__truncate 函数封装了truncate系统调用。
truncate64函数的源码在sysdeps/unix/sysv/linux/truncate64.c文件中。
int
__truncate64 (const char *path, off64_t length)
{
return INLINE_SYSCALL_CALL (truncate64, path,
__ALIGNMENT_ARG SYSCALL_LL64 (length));
}
weak_alias (__truncate64, truncate64)
#ifdef __OFF_T_MATCHES_OFF64_T
weak_alias (__truncate64, truncate);
#endif
__truncate64 函数封装了truncate64系统调用。
#define SYSCALL_LL64(val) \
__LONG_LONG_PAIR ((long) ((val) >> 32), (long) ((val) & 0xffffffff))
64位的参数length转化为2个32位的参数,这两个参数作为系统调用的参数传给系统调用。
#if __BYTE_ORDER == __LITTLE_ENDIAN
# define __LONG_LONG_PAIR(HI, LO) LO, HI
#elif __BYTE_ORDER == __BIG_ENDIAN
# define __LONG_LONG_PAIR(HI, LO) HI, LO
#endif
判断是大端还是小端。
#define __ALIGNMENT_ARG
ftruncate函数的源码在sysdeps/unix/sysv/linux/ftruncate.c文件中。
int
__ftruncate (int fd, off_t length)
{
return INLINE_SYSCALL_CALL (ftruncate, fd, length);
}
weak_alias (__ftruncate, ftruncate)
__ftruncate 函数封装了ftruncate系统调用。
ftruncate64函数的源码在sysdeps/unix/sysv/linux/ftruncate64.c文件中。
int
__ftruncate64 (int fd, off64_t length)
{
return INLINE_SYSCALL_CALL (ftruncate64, fd,
__ALIGNMENT_ARG SYSCALL_LL64 (length));
}
weak_alias (__ftruncate64, ftruncate64)
__ftruncate64 函数封装了ftruncate64系统调用。