glibc源码分析之文件的创建与删除
来源:互联网 发布:知乎源代码下载 编辑:程序博客网 时间:2024/05/21 01:50
glibc中与文件创建与删除有关的函数有creat,open,unlink,mkdir,rmdir,mknod,symlink,link。
这些函数都有对应的系统调用,函数对它们进行了封装。
其中unlink,mkdir,rmdir,symlink,link是用脚本生成的。它们生成的.S文件如下:
#define SYSCALL_NAME unlink#define SYSCALL_NARGS 1#define SYSCALL_SYMBOL __unlink#define SYSCALL_CANCELLABLE 0#define SYSCALL_NOERRNO 0#define SYSCALL_ERRVAL 0#include <syscall-template.S>weak_alias (__unlink, unlink)hidden_weak (unlink)
#define SYSCALL_NAME mkdir#define SYSCALL_NARGS 2#define SYSCALL_SYMBOL __mkdir#define SYSCALL_CANCELLABLE 0#define SYSCALL_NOERRNO 0#define SYSCALL_ERRVAL 0#include <syscall-template.S>weak_alias (__mkdir, mkdir)hidden_weak (mkdir)
#define SYSCALL_NAME rmdir#define SYSCALL_NARGS 1#define SYSCALL_SYMBOL __rmdir#define SYSCALL_CANCELLABLE 0#define SYSCALL_NOERRNO 0#define SYSCALL_ERRVAL 0#include <syscall-template.S>weak_alias (__rmdir, rmdir)hidden_weak (rmdir)
#define SYSCALL_NAME symlink#define SYSCALL_NARGS 2#define SYSCALL_SYMBOL __symlink#define SYSCALL_CANCELLABLE 0#define SYSCALL_NOERRNO 0#define SYSCALL_ERRVAL 0#include <syscall-template.S>weak_alias (__symlink, symlink)hidden_weak (symlink)
#define SYSCALL_NAME link#define SYSCALL_NARGS 2#define SYSCALL_SYMBOL __link#define SYSCALL_CANCELLABLE 0#define SYSCALL_NOERRNO 0#define SYSCALL_ERRVAL 0#include <syscall-template.S>weak_alias (__link, link)hidden_weak (link)
creat,open,mknod是.c文件生成。
open函数位于sysdeps/unix/sysv/linux/open.c文件中。
int__libc_open (const char *file, int oflag, ...){ int mode = 0; if (__OPEN_NEEDS_MODE (oflag)) { va_list arg; va_start (arg, oflag); mode = va_arg (arg, int); va_end (arg); } return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag, mode);}libc_hidden_def (__libc_open)weak_alias (__libc_open, __open)libc_hidden_weak (__open)weak_alias (__libc_open, open)
open函数调用openat系统调用完成封装。如果需要model参数,则从栈中取出。
creat函数位于sysdeps/unix/sysv/linux/creat.c文件中。
int__creat (const char *file, mode_t mode){ return SYSCALL_CANCEL (creat, file, mode);}weak_alias (__creat, creat)
creat函数调用creat系统调用完成封装。
mknod函数位于io/mknod.c文件中
intattribute_hidden__mknod (const char *path, mode_t mode, dev_t dev){ return __xmknod (_MKNOD_VER, path, mode, &dev);}weak_hidden_alias (__mknod, mknod)
__mknod函数调用了__xmknod 函数,__xmknod 函数位于sysdeps/unix/sysv/linux/xmknod.c文件中。
int__xmknod (int vers, const char *path, mode_t mode, dev_t *dev){ unsigned long long int k_dev; if (vers != _MKNOD_VER) return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); /* We must convert the value to dev_t type used by the kernel. */ k_dev = (*dev) & ((1ULL << 32) - 1); if (k_dev != *dev) return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); return INLINE_SYSCALL (mknod, 3, path, mode, (unsigned int) k_dev);}weak_alias (__xmknod, _xmknod)libc_hidden_def (__xmknod)
__xmknod 调用了mknod系统调用完成封装。
阅读全文
1 0
- glibc源码分析之文件的创建与删除
- glibc源码分析之普通文件读写
- java之文件的创建与删除
- glibc源码分析之stat系列函数
- glibc源码分析之stat64系列函数
- glibc源码分析之chmod系列函数
- glibc源码分析之truncate系列函数
- glibc源码分析之chown系列函数
- glibc源码分析之utime系列函数
- glibc源码分析之access函数
- glibc源码分析之rename函数
- glibc源码分析之statfs系列函数
- glibc源码分析之getpriority,setpriority,nice
- glibc源码分析之用户管理
- Tomcat源码分析之Context的创建与启动分析
- 文件的创建与删除
- 文件的创建与删除
- 文件的创建与删除
- python3中列表 元组 字典 集合的区别
- RxJava
- hdu 1058 humble number
- 一位70后的感叹:下半辈子我会陷入贫困吗?
- wxPython ScrolledPanel 滚动条
- glibc源码分析之文件的创建与删除
- SVN解除对项目的版本控制
- 1059. C语言竞赛
- 经验之谈,徐徐道来
- 【读书精华分享】《大规模分布式系统架构与设计实战》彭渊著
- 机器学习算法-决策树生成算法ID3和C4.5
- JQuery插件之 -validate
- 平时写代码的错误记录
- python数据类型转换