参数解析:
pathname:要打开或要创建的目标文件
flags:下面的一个或多个常量进行"或"运算
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写打开
O_CRWAT 文件不存在创建它
O_APPEND 追加写
返回值:成功返回新打开的文件描述符,失败返回-1
参数说明:
fd为要关闭文件的文件描述符
返回值: 关闭成功返回0,关闭失败返回-1
使用:
int main()
{
int fd = open("myfile", O_RDONLY);
if (fd<0){
perror("use open");
exit(1);
}
char buf[1024];
const char *msg = "hello\n";
while (1){
ssize_t s = read(fd, buf, strlen(msg));
if (s>0){
buf[s] = 0;
printf("%s", buf);
}
else{
break;
}
}
close(fd);
return 0;
}
使用:
int main()
{
int fd = open("myfile", O_WRONLY | O_CREAT, 0664);
if (fd <= 0){
perror("use open");
exit(1);
}
const char* msg = "hello,xikeda\n";
int count = 5;
while (count--){
write(fd, msg, strlen(msg));
}
close(fd);
return 0;
}
open函数的返回值就是文件描述符,文件描述符就是一个小的整数
Linux系统默认会有3个缺省打开的文件描述符,分别是标准输入0、标准输出1、标准错误2。
0、1、2分别对应的物理设备是:键盘、显示器、显示器、
当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件,file_struct就是这个数据结构,进程执行open系统调用,必须让进程和文件关联起来。每个进程都有一个file*指针,指向一张表file_struct,该表包括一个指针数组,每个元素都是一个指向打开文件的指针。本质上,文件描述符就是该数组的下标
在file_struct数组中,找到当前没有被使用的最小的一个下标,作为新的文件描述符
a.输出重定向>
b.输入重定向<
c.追加重定向>>
把本来要输出到显示屏的消息输出到文件
我们可以把1号描述符对于的文件(标准输出)关了,在打开一个文件,分配的文件描述符必然是1,这样就可以达到把本来要输到显示屏的消息打印到文件中
因为IO相关函数与系统调用接口对应,并且库函数封装系统调用。所以,本质上,访问文件是通过fd访问的
所以c库当中的FILE结构体内部,必定封装了fd。
printf和fwrintf库函数自带缓冲区,write系统调用接口没有缓冲区,说明缓冲区是C库提供的
缓冲区分为三种:
a.无缓冲
b.行缓冲(按行刷新)
c.全缓冲(缓冲区写满才刷新)
显示器一般是行缓冲,而普通文件是全缓冲
inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的源信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件源信息的区域就叫做inode,中文译名为”索引节点”。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-89585-1.html
农民才55元能做什么