linux内核源码--->fd文件描述符

首先,创建一个test.c文件

vim test.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char **argv)
{
        if(argc != 2)
        {
             printf("Usage:%s \n",argv[0]);
             return -1;
        }

        int fd = open(argv[1], O_RDONLY);

        printf("fd = %d\n",fd);
        while(1)
        {
                sleep(100);
        }
        return 0;
}

编译,且运行该文件,&:表示后台运行,产生一个进程17985,且文件描述符fd=3。

gcc -o test test.c 
/test test.c &

在这里插入图片描述
ps查看后台进程资源运行情况,切换到fd目录查看对应文件描述符。
linux内核源码--->fd文件描述符_第1张图片
open函数的系统调用会进入内核调用内核函数,一个进程就会产生struct task_struct结构体。
文件描述符的关系为,首先是struct task_struct成员变量里有struct files_struct *files结构体,struct files_struct *files里有struct fdtable *fdt结构体,struct fdtable *fdt中有struct file **fd。即struct task_struct—>struct files_struct *files—>struct fdtable *fdt—>struct file **fd。

其中fd为一个数组,表中的元素为文件描述符(本质是索引或标识符)
0 :STDIN_FILENO 接收键盘的输入
1 :STDOUT_FILENO 向屏幕输出
2 :STDERR_FILENO 标准错误
3:上图打开的test.c文件
而这些又分别指向自己的struct file结构体,而这个结构体存放着该文件的一些重要信息
关系如下所示
linux内核源码--->fd文件描述符_第2张图片
linux内核源码--->fd文件描述符_第3张图片

linux内核源码--->fd文件描述符_第4张图片
linux内核源码--->fd文件描述符_第5张图片
linux内核源码--->fd文件描述符_第6张图片

你可能感兴趣的:(1024程序员节,linux,ubuntu)