[CS:APP]程序间的交互和通信

输入、输出、文件的概念

输入、输出、文件

  • 普通文件:文本文件(只含有ASCII或Unicode字符的普通文件、包含若干文本行以\n结束)、二进制文件(其他普通文件)
  • 目录:包含一组连接(link)的文件(文件名.该目录自身的链接、..该目录的父目录的链接、文件的链接、其他目录的链接)
  • 套接字:与另一个进程进行跨网络通信的文件

LInux内核IO函数

Linux系统使用由操作系统内核提供的系统级Unix I/O函数实现IO

打开文件

  • 应用程序要求内核打开相关文件,来声明使用某个IO设备。
  • 并返回一个非负整数(描述符:在当前进程中当前未被打开的最小描述符,一般从3开始)
  • linux shell在每个进程开始时自动打开三个文件(0-标准输入STDIN_FILENO、1-标准输出STDOUT_FILENO、2-标准错误STDERR_FILENO)。
#include <sys/types.h> //操作系统的基本数据类型
#include <sys/stat.h> //文件的全部属性
#include <fcntl.h> //控制描述符
int open(char *filename,int flags,mode_t mode);//将filename转为文件描述符
  • 访问方式参数int flags:
    宏名|作用
    -|-
    O_RDONLY|只读
    O_WRONLY|只写
    O_RDWR|可读写
    O_CREAT|若存在则覆盖(不存在就创建)
    O_TRUNC|若存在则覆盖(不存在不创建)
    O_APPEND|若存在则追加结尾(不存在不创建)
  • 文件访问权参数mode_t mode:由3个bit组成,从左到右依次为拥有者、拥有者所在组、其他人(anyone)的权限(每个bit的值为R=4读权限、W=2写权限、X=1执行权限)
  • 每个进程都用umask函数可以设置一个umask的值、最终打开文件时的文件访问权为:mode&~umask、通常为umask(0)
mode_t umask(mode_t mask);

关闭文件

应用程序要求内核关闭文件、由内核释放文件打开时创建的数据结构、描述符变为当前未被打开的描述符、当进程结束时也可自动调用关闭所有文件并释放内存资源、当前文件位置k=0

改变当前文件位置k

对于每个打开的文件、内核中始终保持一个文件位置k(从文件开头起始的字节偏移量、初始值为0)

读取文件

从m个字节的文件当前位置k,复制n个字节到内存,并将文件当前位置更新为k+n。当k≥m时,会触发EOF条件

写入文件

从文件的当前位置k开始,把内存的n个字节复制,并将文件当前位置更新为k+n

猜你喜欢

转载自www.cnblogs.com/rayoli/p/12819291.html
今日推荐