基础 IO、系统调用接口

博客主要介绍文件相关系统调用接口,如open、write、read、lseek等,阐述各接口的参数、返回值及作用。还介绍了umask用于控制文件或目录默认权限,以及文件描述符的概念,它是进程与文件关联的关键,本质是数组下标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件相关系统调用接口


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

pathname:文件路径名

flags: 选项标志 ,也可以理解为打开方式,主要有以下6种定义,下面三种必选一
(1)只读 O_RDONLY (2)只写 O_WRONLY (3)可读可写 O_RDWR

以下三种打开方式: 可选项可不选
(1) O_CREAT 文件不存在则创建,存在则打开 ;不可与 O_EXCL 同用
(2) O_TRUNC 打开文件的时候清空原有内容       
(3) O_APPEND 写追加模式(总是追加在末尾)

mode :创建文件时给定权限 (八进制数字)
计算方法 (1)mode & (~umask) (2)用最大权限减去 umask 的值

说到 umask(),就得稍微哆嗦两句,毕竟也是一个知识点,它是干嘛用的,诶~
它,,是用来控制文件或目录的默认权限,推介用第一种方法计算文件权限;一般情况下文件最大权限是666,目录最大权限是777;点击>>umask具体的描述

该系统接口的返回值是:文件描述符(正整数) ;出错返回 -1

  int fd = open("./text2.txt",O_RDWR | O_CREAT |O_APPEND ,0777);
  if(fd<0){
    perror("open error");
    return -1;
  }

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

fd 打开文件返回的文件描述符,类型是 int 型
buf 要向文件写入数据
count 要写入的数据长度
返回值 实际写入的字节数 ;错误返回 -1

  char buf[1024]="Are you ok !!";
  int ret = write(fd,buf,strlen(buf)); 
  if(ret < 0 ){
    perror("write error");
    return -1;
  }
  printf("写入数据的长度:%d\n",ret);

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

fd 打开文件所返回的文件描述符
buf 对读取到的数据进行存储的位置
count 要读取的数据长度
返回值 实际的读取字节数 出错返回 -1

  lseek(fd,0,SEEK_SET);
  //在读数据之前要加这条语句,否则读不到数据·
  memset(buf,0x00,1024);
  
  ret = read(fd,buf,1023);
  if(ret < 0){
    perror("read error");
    return -1;
  }else if(ret == 0){
    printf("no date\n");
  }else{
    printf("读到%d个字节\n",ret);
    printf("read buf : [%s]\n",buf); 
  }

off_t lseek(int fd , off_t offset , int whence);

fd 打开文件所返回的文件描述符
offset 偏移量
whence 偏移位置
SEEK_SET
SEEK_CUR
SEEK_END

返回值 返回当前位置到文件起始位置的偏移量

  lseek(fd,0,SEEK_SET);

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

int main(){
  umask(0);
  //设置调用进程的文件创建权限掩码,
  int fd = open("./text2.txt",O_RDWR | O_CREAT |O_APPEND ,0777);
  if(fd<0){
    perror("open error");
    return -1;
  }

  char buf[1024]="Are you ok !!";
  int ret = write(fd,buf,strlen(buf)); 
  if(ret < 0 ){
    perror("write error");
    return -1;
  }
  printf("写入数据的长度:%d\n",ret);

  lseek(fd,0,SEEK_SET);
  //在读数据之前要加这条语句,否则读不到数据·
  memset(buf,0x00,1024);

  ret = read(fd,buf,1023);
  if(ret < 0){
    perror("read error");
    return -1;
  }else if(ret ==0){
    printf("no date\n");
  }else{
    printf("读到%d个字节\n",ret);
    printf("read buf : [%s]\n",buf); 
  }
  close(fd);

  return 0;
}

文件描述符

文件描述符就是一个整数,Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2;

文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数
组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件

文件描述符详细介绍

https://blog.youkuaiyun.com/captain_mxd/article/details/52153233

https://www.cnblogs.com/ginvip/p/6350222.html

https://www.cnblogs.com/alan666/p/8311890.html

重定向 《=点它

https://www.cnblogs.com/linuxAndMcu/p/7668138.html

https://blog.51cto.com/keren/170892

https://www.cnblogs.com/GODYCA/archive/2013/01/05/2846197.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值