`
kmplayer
  • 浏览: 508854 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内核对文件的管理

阅读更多
1,文件元数据。
stat结构体:

struct stat
{
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //i-node节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态(属性)改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //文件内容对应的块数量
};

返回stat结构体:
struct stat finfo;
stat( const char* filename, &finfo );
fstat( int fd, &finfo );
实例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>

int main()
{
    struct stat filestat;
    char* filename = "file.txt";
    char* type;
    char* readok;
    char timebuf[26];;
    if (stat(filename, &filestat) < 0)
        fprintf(stderr, "stat error: %s", strerror(errno));
    if (S_ISREG(filestat.st_mode))
        type = "regular";
    else if (S_ISREG(filestat.st_mode))
        type = "directory";
    else
        type = "other";
    fprintf(stdout,"type: %s\n", type);
    if ((filestat.st_mode & S_IRUSR))
        readok = "yes";
    else
        readok = "no";
    fprintf(stdout,"usr read: %s\n", readok);
    strcpy(timebuf, ctime(&filestat.st_mtime));
    fprintf(stdout, "Time modified : %s", timebuf);
    fprintf(stdout, "filesize : %d", (int)filestat.st_size);
    return 0;
}

2,关于文件共享:
内核用三种相关的数据结构表示打开的文件:
(1)描述符表:每个进程都有自己独立的描述符表。
表的每一项指向文件表中的一个表项。
(2)文件表:所有进程共享。
每一项包括三个内容:文件当前位置;引用计数;指向v-node表项的指针。
注:关闭一个文件描述符,引用计数减1。当引用计数为0时,内核才会删除这个表项。
(3)v-node表:所有进程共享。
每一项包括stat结构中的大多数信息。

3,多个描述符可以通过不同的文件表项指向同一个文件。
此时,文件对不同描述符的偏移位置不同。




4,子进程有一个父进程表的副本。
相当于父进程描述符指向的表项引用计数都要加1。



5,I/O重定向
dup(4,1); //结果:标准输出的描述符指向4所在的表项。
实例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>
#include <sys/wait.h>

void unix_error(char *msg) /* unix-style error */
{
    fprintf(stderr, "%s: %s\n", msg, strerror(errno));
    exit(0);
}

int Open(const char *pathname, int flags, mode_t mode)
{
    int rc;
    if ((rc = open(pathname, flags, mode))  < 0)
        unix_error("Open error");
    return rc;
}

ssize_t Read(int fd, void *buf, size_t count)
{
    ssize_t rc;
    if ((rc = read(fd, buf, count)) < 0)
        unix_error("Read error");
    return rc;
}

pid_t Fork(void)
{
    pid_t pid;

    if ((pid = fork()) < 0)
        unix_error("Fork error");
    return pid;
}

pid_t Wait(int *status)
{
    pid_t pid;

    if ((pid  = wait(status)) < 0)
        unix_error("Wait error");
    return pid;
}

int Dup2(int fd1, int fd2)
{
    int rc;

    if ((rc = dup2(fd1, fd2)) < 0)
        unix_error("Dup2 error");
    return rc;
}

int main()
{
    int fd1, fd2;
    char c;
    fd1 = Open("file.txt", O_RDONLY, 0);
    fd2 = Open("file.txt", O_RDONLY, 0);
    Read(fd1, &c, 1);
    fprintf(stdout, "%c\n", c);
    Read(fd2, &c, 1);
    fprintf(stdout, "%c\n", c);
    //注:fd1和fd2通过不同的表项指向同一个文件,文件的偏移独立。
    if (Fork() == 0)
    {
        Read(fd1, &c, 1);//子进程和父 进程指向同一个表项,文件偏移一样。
        fprintf(stdout, "%c\n", c); //打印第二个字符
        exit(0);
    }
    Wait(NULL);
    Read(fd1, &c, 1);//子进程修改的偏移影响到了父进程
    fprintf(stdout, "%c\n", c); //打印第三个字符

    Dup2(fd2, fd1);
    Read(fd1, &c, 1); //fd2指向的文件表项发生了偏移
    fprintf(stdout, "%c\n", c); //打印第 2个字符

    return 0;
}
  • 大小: 38.4 KB
  • 大小: 56.7 KB
分享到:
评论

相关推荐

    linux内核技术文档

    这份文档对于软件开发者、系统管理员、设备驱动程序编写者以及对Linux内核感兴趣的任何人都具有极高的价值。 在Linux内核技术文档中,你可以找到以下关键知识点: 1. **内核架构**:Linux内核采用微内核架构,其...

    Linux3.2内核帮助文档

    Linux内核是操作系统的核心部分,负责管理系统的硬件资源、进程调度、内存管理、文件系统以及设备驱动等关键功能。在本资源中,我们关注的是Linux内核版本3.2.4的帮助文档,这是一个英文版的HTML集合,对于理解和...

    ubuntu内核管理工具

    在进行内核管理时,还应了解一些基本概念,如内核版本号(如4.15.0-15-generic),其中`4`是主版本,`15`是次版本,`0`是修订版,`-15-generic`是Ubuntu特定的构建编号,表示是第15次对这个内核版本的修改,适用于...

    Linux内核管理PDF

    - **CREDITS**:记录了对Linux内核发展作出贡献的人物名单,表彰他们的卓越贡献。 - **Documentation/**:包含了内核的各种文档,供开发者和用户查阅。 - **MAINTAINERS**:列出了内核各部分的主要维护者,方便联系...

    内核链表 -- 学生管理系统

    内核链表是操作系统内核中常用的一种数据结构,它在学生管理系统中可以用来高效地组织和操作学生信息。在本项目中,我们将利用内核链表实现...这个项目不仅加深了对内核链表的理解,也锻炼了文件I/O和内存管理的技能。

    强大内核级进程管理器

    总的来说,PowerToolV2.8内核级进程管理器是系统管理员和高级用户的理想工具,它提供了对系统进程的深度控制和安全保障,有助于提升计算机的运行效率和安全性。对于想要深入了解和优化自己电脑性能的用户,...

    Linux命令,内核学习文档

    这个压缩包文件包含了深入学习Linux命令、系统管理和内核理解的重要资源,对于任何想要提升Linux技能的人来说都是宝贵的资料。 首先,让我们从“Linux命令手册”开始。这通常是一系列文档,详细解释了Linux系统的...

    Linux内核文档(一)

    首先,Linux内核文档主要分为多个部分,包括概述、体系结构特定部分、子系统、驱动程序、文件系统、虚拟内存、进程管理、网络协议栈等。这些部分详细地阐述了内核的各个组件和它们之间的交互。 在"概述"中,文档...

    linux内核缓冲区管理课件.rar

    10. **内存映射(Memory Mapping)**:Linux内核支持将磁盘文件映射到进程的地址空间,允许直接访问文件内容,减少了对缓冲区的需求。 通过深入学习“Linux内核缓冲区管理”,你可以掌握如何优化系统性能,理解和...

    编译linux的内核文档

    "编译Linux的内核文档"这一过程涉及了内核配置、驱动设置以及文件系统设置等多个环节。在进行内核编译时,我们通常会使用`make menuconfig`命令来配置内核选项。 `make menuconfig`是一个基于文本菜单的内核配置...

    内核管理系统,这是我的一个毕业学长设计的,他现在是公司总设计

    内核管理系统则是对内核进行设计、管理和优化的一整套技术和方法。这包括内核的配置、模块化、裁剪、调试、安全性和性能调优等方面。一个优秀的内核管理系统可以使操作系统更加高效、灵活,并适应各种不同的硬件和...

    Linux内核映像文件

    Linux内核映像文件是操作系统的核心部分,负责管理和协调计算机硬件与软件资源,为其他程序提供基础服务。在嵌入式系统中,特别是在开发板或物联网设备上,使用经过裁剪的Linux内核映像非常常见,以确保系统运行轻量...

    linux内核函数文档.pdf

    Linux 内核函数文档 Linux 内核函数文档是 Linux 操作系统的核心组件之一,它提供了一个详细的 API 文档,帮助开发者更好地理解和使用 Linux 内核函数。本文档中包含了 Linux 内核函数的详细信息,包括驱动程序的...

    kpw3 内核文件 降级文件 img

    【描述】"kpw3 内核img kpw3 内核文件 降级文件 img" 表明用户可能正在尝试对Kpw3的内核进行降级操作。这可能是由于新版本的内核存在不稳定问题,或者用户想要恢复到一个已知良好状态的旧版本内核。"main_kernel.img...

    内核管理工具

    在提供的压缩文件"PowerToolV2.7"中,可能包含的就是这样一个功能全面的内核驱动管理工具。用户在使用前应先了解其系统需求,确保兼容性,然后按照软件的安装指南进行安装。在使用过程中,遵循软件提供的提示进行...

    内核代码驱动文件

    首先,《LINUX内核设计与实现》这本书提供了对Linux内核的全面剖析,从宏观的设计理念到微观的代码实现,它涵盖了内核启动过程、进程管理、内存管理、文件系统、网络协议栈等多个关键领域。读者将了解到如何在Linux...

    linux内核与文件系统

    而文件系统则是内核的一部分,用于组织和管理存储设备上的数据,使用户能够以有序的方式访问和操作文件。 Linux内核: 1. **模块化设计**:Linux内核采用模块化设计,可以根据需要加载或卸载特定的硬件驱动,这...

    Linux内核完全注释:基于0.11内核(V5.0)_0.11内核_linux_linux内核完全注释_Linux内核注释_

    《Linux内核完全注释:基于0.11内核(V5.0)》是一部深入解析Linux内核的重要参考资料,它详细解读了Linux操作系统的...这对于系统管理员、软件工程师、内核开发者以及对操作系统感兴趣的读者来说都是一份宝贵的资料。

    LINUX 内核注释WORD文档

    1. **内核结构**:Linux内核采用模块化设计,包括进程管理、内存管理、设备驱动、文件系统和网络协议栈等多个主要部分。了解这些模块的功能和相互关系是深入理解内核的基础。 2. **进程管理**:内核如何创建、调度...

Global site tag (gtag.js) - Google Analytics