Linux文件相关系统调用接口、fd文件描述符与FILE结构体对比

文件相关系统调用接口:

open():

#includ e <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode)

说明:
open()函数有两个重载的版本,依照调用时传递的实参的不同运行时调用不同版本的函数。
参数:
pathname:是要操作文件的路径(包括名字),可以是相对路径,也可以绝对路径。
flags:是对pathname指定的文件要进行的操作,可以有以下几种模式:
O_WRONLY:以只写方式打开
O_RDONLY:以只读方式打开
O_RDWR:以读写方式打开
上面三个常量,必须指定一个,且只能指定一个。
O_CREAT:若文件不存在,则创建它,需要使用mode参数,指定新文件的访问权限。
O_APPEND:追加写方式,配合 O_WRONLY或O_RDWR一起使用。
上面两个常量可以同时使用,使用时,可以与前三个常量中的一个进行|操作。
返回值:
成功:返回操作文件的文件描述符(后面介绍)。
失败:返回-1。
close():

#include <unistd.h>

int close(int fd);

说明:
此函数用于关闭open()函数打开的文件描述符,否则会出现资源泄露问题,操作系统可以打开的资源数是有上限的,如不及时关闭可能会造成文件打开失败的情况。
read():

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

说明:
此函数以文件描述符为标记,用于从open()函数打开的文件中读取数据。
参数;
fd:open()函数打开的文件的对应文件描述符。
buf:读出的数据要存放的缓冲区。
count:请求读取的字节数。
返回值:
ssize_t:有符号整形,实际读取到的字节数,若文件结束或count == 0,返回0,若读取失败返回-1。
write():

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

说明:
该函数往fd标示的文件中写数据。
参数:
fd:open()函数打开的文件描述符。
buf:想要写入文件中的数据。
count:请求写入文件中的字节数。
返回值:
实际写入文件中的字节数,失败返回-1。
代码:
写文件:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>


int main(){
  umask(0);
  int fd = open("myfile",O_WRONLY|O_CREAT,0666);
  if(fd < 0){
    perror("open");
    return -1;
  }
  const char *msg = "hello 你好\n";
  int count = 5;
  int len = strlen(msg);
  while(count--){
    //写文件
    write(fd,msg,len);
  }
  close(fd);
  return 0;
}

结果:
这里写图片描述
读文件:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>

int main(){
  //打开文件
  int fd = open("myfile",O_RDONLY);
  if(fd < 0){
    perror("open");
    return -1;
  }
  const char *msg = "hello 你好\n";
  char buf[1024];
  while(1){
   //读文件
   ssize_t s = read(fd,buf,strlen(msg));
   if(s > 0){
     buf[s] = '\0';
     printf("%s",buf);
   }else if(s == 0){
     break;
   }else{
     perror("read");
     return -1;
   }
  }
  close(fd);
  return 0;
}

结果:
这里写图片描述


fd文件描述符与FILE结构体的对比:

fd:
fd的类型为int类型,想要描述清楚文件描述符的作用,我们首先要剖析操作系统是如何对打开的文件进行组织管理的。见下图:
这里写图片描述
说明:
在每一个进程的PCB结构(task_struct)中都有一个files指针,指向files_struct结构,在files_struct结构中有一个fd_array[ ]数组,该数组存储file*指针,file*指针指向file结构,当操作系统每打开一个文件时会在内核中创建相应的file结构存储文件的inode元信息,fd便是fd_array[ ]数组的下标,当要访问文件时,操作系统会根据文件的文件描述符(fd)从fd_array[ ]数组中拿到相应的file*指针,进而找到file结构,根据file结构中存储的inode元信息访问磁盘上的文件。在内核态对文件的操作都是根据fd进行操作的。
FILE:
FILE则是在lib层对文件进行的的操作,由此可以推断FILE是对fd的封装,实际中FILE结构体中也是包含有fd字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值