Linux下的文件的一些小笔记~

    技术2022-06-24  50

          以前只知道用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); } 

    最后证明确实能够打开~~并没有什么好神奇的地方~文件描述服只是一个马甲而已。


    最新回复(0)