以前只知道用int fd; fd = open.....可以打开文件,进行一系列的文件操作,今天在学习过程中,了解了一些系统调用底层的数据结构操作~写上来做个笔记。
首先要,当我们对一个文件进行open系统调用的时候,内核对我们的文件做了一下操作:首先返回一个文件标志符,这个符号是唯一的,整形值。比如,这里我们打开了2个文件提示符,结构如下所示:
(据说Linux没有使用V节点,通用的I节点结构来实现这里的功能)
I节点指针里面的数据就是内核保存的文件的一些信息了。我们可以用stat结构体去编程查看:#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/stat.h> int main(void) { struct stat statbuf; lstat("test.c", &statbuf); printf("%d", statbuf.st_uid); return 0; }
本来有3个函数(int fstat(int fildes, struct stat *statbuf); int stat(const char *path, stuct *statbuf); int lstat(const char *path, struct stat *statbuf);这里,stat和lstat的区别就是,当我们打开的文件是一个链接符号的时候,lstat打开的是它本身,但是stat却是打开的链接指向文件的信息。具体stat结构里包含了如下信息
------------------------------------------------------
st_mode 文件权限和文件类型信息
st_ino 文件相关联的inode信息
st_sev 保存文件的设备
st_uid 文件属主的UID(user_id)号
st_gid 文件属主的GID(grop_ID)号
st_atime 文件的上一次被访问的时间
st_ctime 文件的权限,属主,组或者内容上一次被改变的时间
st_mtime 文件的内容上一次被修改的时间
st_nlink 该文件上的硬链接个数
-----------------------------------------------------
好了,当我们系统调用open结束后,标识着我们的内核已经把文件的数据结构都创建好了,返回一个指向该数据结构的标志(如上图所示)这里我们只要有那个文件描述符的值,就可以访问该文件(保证该文件描述服没被close(); )这里可以用这个程序来测试:#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <limits.h> int main(int argc, char *argv[]) { int fd; int tmp_fd; char str[10]; fd = open("test.c", O_RDONLY); if (fd == -1){ perror("Open!"); } sprintf(str, "%d", fd); tmp_fd = atoi(str); printf("%d", tmp_fd); while(read(tmp_fd,str,10) >0) { printf("%s", str); } close(fd); }
最后证明确实能够打开~~并没有什么好神奇的地方~文件描述服只是一个马甲而已。