基础文件I\O

标准输入,标准输出,标准错误
-----> stdin stdout stderr
实质:是文件指针(FILE*),指向对应的文件结构体

库函数:对系统调用进行一层封装,使用户更容易使用系统调用
会自带缓冲区(fopen, fread, fclose, fwrite)

系统调用:操作系统提供的接口,用户可通过系统调用进行开发等…
(open, read, close, write, lseek)

open函数:
原型:int open(const char* pathname, int flags, [mode_t mode]);
pathname:要打开的文件
flags: 只读(O_RDONLY) 只写(O_WRONLY) 读写(O_RDWR) 追加(O_APPEND)
成功:返回操作该文件的句柄,即文件描述符
失败:-1
注:flags 还有一个 O_CREAT :若文件不存在,则创建它,需要使用mode选项,指明文件的访问权限

文件描述符

概念:从0开始的小整数,是文件描述符表(数组)的下标

stdin 对应文件描述符 0
stdout 对应文件描述符 1
stderr 对应文件描述符 2

分配原则:每当要申请文件描述符时,都会在文件描述符表当中找到当前没有被使用的最小的一个下标作为新的文件描述符

关闭文件描述符: close(fd);
1.当文件不再使用了,就需要关闭文件描述符
2.关闭文件描述符,会清理文件描述符所对应的file对象,并且在文件描述符表中将该文件描述符的位置清理掉
3.若不关闭文件,会导致文件描述符泄漏,以至于无法正确打开文件
注:文件描述符的上限可由 ulimit -a 查看
也可以修改上限值,文件描述符上限可由用户自己配置

文件描述符的重定向
通过 dup2(oldfd, newfd):将new重定向在old上
即让new变得和old一样
代码实现:

#include<stdio.h>                                                                                                 
#include<unistd.h>                                                                                                
#include<sys/types.h>                                                                                             
#include<sys/stat.h>                                                                                              
#include<fcntl.h>                                                                                                 
                                                                                                                  
int main()                                                                                                        
{    
	//以只写方式打开文件dup.txt,得到文件描述符writefd																											//
    int writefd = open("./dup.txt", O_WRONLY);                                                                    
    if(writefd < 0){                                                                                              
        perror("write open error");                                                                               
        return -1;                                                                                                
    }   
	//以只读方式打开文件dup2.txt,得到文件描述符readfd	
    int readfd = open("./dup2.txt", O_RDONLY);                                                                    
    if(readfd < 0){                                                                                               
        perror("read open error");                                                                                
        return -1;                                                                                                
    }  
	//将标准输出重定向到writefd,调用printf时,就会将数据写入dup2.txt中
	//将标准输入重定向到readfd,调用read(0,...)时,就会将dup.txt中的数据读取出来
    dup2(writefd, 1);                                                                                             
    dup2(readfd, 0);                                                                                              
                                                                                                                  
    char buf[1024] = {0};                                                                                         
    int ret = read(0, buf, sizeof(buf) - 1);                                                                      
    if(ret < 0){ 
		perror("read error");                                                                                     
        return -1;                                                                                                
    }                                                                                                             
    printf("buf = %s\n", buf);                                                                                    
    return 0;                                                                                                     
}  

调用之前:
在这里插入图片描述
调用之后:
在这里插入图片描述
输出重定向
将本该输出到标准输出上的数据,输出到某个文件当中
常见重定向:>:输出重定向, <:输入重定向, >>:追加重定向

Linux缓冲机制:

1.无缓冲
2.行缓冲:
a).在遇到\n时刷新缓冲区
b).当缓冲区满了之后,刷新缓冲区
c).当程序退出时,刷新缓冲区
d).手动调用了fflush后,刷新缓冲区
3.全缓冲:
a).当缓冲区满了之后,刷新缓冲区
b).当程序退出时,刷新缓冲区
c).手动调用了fflush后,刷新缓冲区
注:若将数据输出到标准输出上,其缓冲机制是 行缓冲
若将数据输出到文件当中,其缓冲机制是 全缓冲

文件系统

操作系统核心的组成部分
stat 文件名: 显示文件的详细信息

以EXT4文件系统为例:
如图:
在这里插入图片描述
其内容分为三个部分: 超级块 i节点表 数据区
超级块:存放文件系统结构信息
i节点表:存放文件属性,即存放Inode结构体(用来描述磁盘中的文件)
数据区:存放文件内容
创建一个文件的步骤:
如图:
在这里插入图片描述
注:真正找到磁盘上文件内容的,是Inode,而不是文件名,所以一个Inode可以对应多个文件名!!
也就引出软、硬链接

关于进程的其他内容,大家可以关注一下我的博客,会不定期更新!
还请多多指教!!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值