glibc源码分析之普通文件读写

glibc中关于普通文件读写的函数有open,close,read,write,lseek,lseek64。它们分别封装了open,close,read,write,lseek,_llseek系统调用。
lseek用于在32位长度的文件中跳转,_llseek用于在64位长度的文件中跳转。
open函数的封装在前文中已经介绍了。

close函数定义在sysdeps/unix/sysv/linux/close.c文件中。

int
__close (int fd)
{
  return SYSCALL_CANCEL (close, fd);
}
libc_hidden_def (__close)
strong_alias (__close, __libc_close)
weak_alias (__close, close)

__close 函数调用了close系统调用。

read函数定义在sysdeps/unix/sysv/linux/read.c文件中

ssize_t
__libc_read (int fd, void *buf, size_t nbytes)
{
  return SYSCALL_CANCEL (read, fd, buf, nbytes);
}
libc_hidden_def (__libc_read)

libc_hidden_def (__read)
weak_alias (__libc_read, __read)
libc_hidden_def (read)
weak_alias (__libc_read, read)

__libc_read函数调用了read系统调用。

write函数定义在sysdeps/unix/sysv/linux/write.c文件中

ssize_t
__libc_write (int fd, const void *buf, size_t nbytes)
{
  return SYSCALL_CANCEL (write, fd, buf, nbytes);
}
libc_hidden_def (__libc_write)

weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
libc_hidden_weak (write)

__libc_write 函数调用了write系统调用。

lseek函数定义在sysdeps/unix/sysv/linux/lseek.c文件中。

static inline off_t lseek_overflow (loff_t res)
{
  off_t retval = (off_t) res;
  if (retval == res)
    return retval;

  __set_errno (EOVERFLOW);
  return (off_t) -1;
}

off_t
__lseek (int fd, off_t offset, int whence)
{
  loff_t res;
  int rc = INLINE_SYSCALL_CALL (_llseek, fd,
                (long) (((uint64_t) (offset)) >> 32),
                (long) offset, &res, whence);
  return rc ?: lseek_overflow (res);
}
libc_hidden_def (__lseek)
weak_alias (__lseek, lseek)
strong_alias (__lseek, __libc_lseek)

__lseek 函数调用了_llseek系统调用。

lseek64函数定义在sysdeps/unix/sysv/linux/lseek64.c文件中。

off64_t
__lseek64 (int fd, off64_t offset, int whence)
{
  loff_t res;
  int rc = INLINE_SYSCALL_CALL (_llseek, fd,
                (long) (((uint64_t) (offset)) >> 32),
                (long) offset, &res, whence);
  return rc ?: res;
}

__lseek64 调用了_llseek系统调用。

发布了185 篇原创文章 · 获赞 18 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/pk_20140716/article/details/77386126