IO:open/read/write/close等文件相关系统调用接口

标准库IO接口:

fopen fseek fwrite fread close
fprintf sprintf snprintf printf fgets
fopen (file, “r r+ w w+ a a+”);
r: 若文件存在则以只读方式打开.不存在报错
r+: 若文件存在则以只读写方式打开,不存在报错
w: 若文件不存在则创建,否则清空原有内容,以只写打开.
w+ : 若文件不存在则创建,否则清空原有内容,以只读写打开
a: 若文件不存在则创建, 以追加写打开
a+: 若文件不存在则创建,以追加写打开
输出信息到显示器

#include <stdio.h>
#include <string.h>
int main()
{
const char *msg = "hello fwrite\n";
fwrite(msg, strlen(msg), 1, stdout);
printf("hello printf\n");
fprintf(stdout, "hello fprintf\n");
return 0;
}

stdin&stdout&stderr
c默认打开此三个输入输出流,类型都是FILE* ; fopen返回值类型,文件指针

系统调用的IO接口

open
在这里插入图片描述
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用一个或者多个常量进行"或"运算,构成flags

  • O_RDONLY: 只读打开

  • O_WRONLY: 只写打开

  • O_RDWR: 读写打开
    以上三个常量,必须指定一个且只能指定一个

  • O_CREAT: 若文件不存在,则创建它,需要mode选项.来指明新文件的访问权限

  • O_APPEND: 追加写
    返回值:
    成功:新打开的文件描述符
    失败: -1
    write

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

read
read() 从文件描述符 fd 中读取 count 字节的数据并放入从buf开始的缓冲区中.

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

lseek

#include <sys/types.h>
#include <unistd.h>
 off_t lseek(int fd, off_t offset, int whence);

close

#include <unistd.h>
int close(int fd);

文件描述符fd
进程通过struct file结构体来描述打开的文件—使用了struct file *fd_array[], 文件描述符就是这个数组的下标—用户打开文件, 操作系统通过file 结构体描述符文件,并且将指针添加进入fd_array中,向用户返回这个文件描述信息在数组中位置(下标), 用户操作的时候,将这个下标传递给操作系统, 操作系统通过文件下标描述信息进而操作文件.
进程的文件描述符是有上限的
文件描述符的分配原则: 最小分配原则

标准输入标准输入标准错误
012文件描述符
STDIN_FLIEONSTDOUT_FILEONSTDERR_FILEON
stdinstdoutstderr文件流指针

文件描述符和文件流指针:
库函数的操作句柄是文件流指针
系统调用接口的句柄是文件描述符
文件流指针这份FILE结构体中就包括一个文件描述符成员变量.
进程运行在用户态/进程运行内核态:
用户态切换到内核态:发起系统调用(fwrite write read memcpy)

重定向

改变数据流向,将写入指定文件的数据,改变之后写入到另一个文件
使用dup2系统调用

#include <unistd.h>
int dup2(int oldfd, int newfd);

让newfd也指向oldfd所指向的文件;并且如果newfd本身已经打开了文件,则关闭原来的文件,newfd,oldfd都指向oldfd所指向文件
重定向指的是描述符的重定向—因为描述符本身并没有改变,改变的是描述符所对应的的文件信息

标准库IO接口与系统调用IO接口的关系;
库函数对文件的操作实际上是通过系统调用来实现的
系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性
标准IO库函数提供的文件操作函数如fopen, fread, fwrite, fclose, fflush, fseek等,
库函数调用通常用于应用程序中对一般文件的访问。
库函数调用是系统无关的,因此可移植性好。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值