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 操作系统的核心组件之一,它提供了一个详细的 API 文档,帮助开发者更好地理解和使用 Linux 内核函数。本文档中包含了 Linux 内核函数的详细信息,包括驱动程序的...
自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,...本文介绍一下 Linux 内核中文件 Cache 管理的机制。以 2.6 系列内核为基准,主要讲述工作原理、数据结构和算法,不涉及具体代码。
PowerToolV2.8内核级进程管理器(含文件粉碎机),比系统自带的那个强很多!
EX 内核管理器(EXKM)通过高级功能和精美优化的材料设计用户界面使您可以完全控制硬件。 EXKM是用于性能调节,最大限度地延长电池寿命,配置手势或调节颜色和声音的终极工具。 普遍!适用于所有内核和设备。在...
根据《深入/理解Linux内核》这本书,整理的文档
Linux内核是操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux内核源程序可以在/usr/src/linux下找到。Linux的新内核版本修订了旧内核的bug,并增加了许多...
鉴于此,《Linux内核精髓:精通Linux内核必会的75个绝技》选取了资源管理(CPU、内存、进程等)、文件系统、网络、虚拟化、省电、调试、概要分析、追踪、内核调整等Linux内核的核心主题进行了深入剖析和讲解,总结出...
漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32的系统调用机制 漫谈兼容内核之六:二进制映像的类型识别 漫谈兼容内核之七:Wine的二进制映像...
该内核的源代码包括文件系统、进程管理、内存管理和网络协议等多个子系统。它采用模块化的设计理念,允许开发者扩展和替换不同的部分。Linux 0.11内核具有高度的可移植性和可扩展性,可以在多个硬件平台上运行,并且...
Linux内核的内存管理机制是基于虚拟地址空间的,进程的线性地址空间被分为多个线性区,每个线性区都有其自己的保护模式和标志,并且映射同一个文件。进程的线性区由vm_area_struct结构体表示,并且按照地址从小到大...
《Linux内核API完全参考手册》作为源码开放...内核模块机制API、进程管理内核API、进程调度内核API、中断机制内核API、内存管理内核API、内核定时机制API、内核同步机制API、文件系统内核API和设备驱动及设备管理API。
一组更新的系统文件(主要是动态链接库或 DLL),允许您运行通常仅限于 Windows 7 及更高版本的现代应用程序。 我该如何安装它? 下载后解压缩 7z 存档并使用管理权限运行基于 .cmd 的安装程序脚本。 它允许我做...
概括介绍Linux的缓冲区管理,对linux的缓冲区管理进行说明,以pdf格式发布ppt格式的文件
1.3 内核引导程序 5 2 内核映像的形成 8 2.1 MakeFile预备知识 9 2.1.1 Makefile书写规则 9 2.1.2 Makefile变量 10 2.1.3 条件判断 14 2.1.4 函数 17 2.1.5 隐含规则 17 2.1.6 定义模式规则 19 2.1 KBuild体系 23 ...
新版本的 Linux 内核支持 Ceph 文件系统功能 Linux 操作系统是一个广泛使用的开源操作系统,自从 Linus Torvalds 于 1991 年创建以来,已发展成一个功能强大且广泛应用的操作系统。近年来,Linux 内核的发展速度...
全书分为20章,内容包括进程管理、进程间通信、内存管理、文件系统、I/O接口及资源管理、内核的编译及调试原理、网络通信、内核安全、USB驱动程序等。 对于想了解Linux开发,以及从事Linux内核编程的开发人员来说,...
ioctl 函数是Linux中最重要的设备文件操作函数之一,负责对设备文件进行读取、写入、控制等操作。 在Linux中,还有一个非常重要的概念,那就是模块参数。模块参数是指在Linux内核中使用的参数,用于配置内核模块的...
本文对 Linux 内核的分析及应用进行了详细的描述,涵盖了 Linux 内核的体系结构、进程调度、内存管理、进程间通信、虚拟文件系统及网络等方面。 Linux 内核是一种多用户多任务操作系统,它具有同类操作系统所固有的...
内核模块机制API、进程管理内核API、进程调度内核API、中断机制内核API、内存管理内核API、内核定时机制API、内核同步机制API、文件系统内核API和设备驱动及设备管理API。, 《Linux内核API完全参考手册》立足Linux...