您的位置:首页 > 其它

glibc源码分析之truncate系列函数

2017-08-15 20:07 1516 查看
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系统调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: