LinuxC open() umask close() read() write() lseek() fcntl() ioctl() mmap() ext2 stat() dup() dup2()

缓冲

1)全缓冲:缓冲区填满了才触发系统调用。例如fputc()

2)行缓冲:出现换行或缓冲区填满才出发系统调用。例如stdout

3)无缓冲:立即系统调用,没有缓冲区。例如stderr


open()

  • 打开或创建一个文件。成功返回新分配的文件描述符,失败返回-1并设置errno
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// pathname: 打开或创建的文件名及所在路径
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • 文件描述符:一个整型,值为0表示stdin标准输入,值为1表示stdout标准输出,值为2表示stderr标准错误

  • open()形参的 flags
    1)必指定以下一个且仅允许指定一个,以下开头的 O_ 表示 or

    O_RDONLI:只读打开

    O_WRONLY:只写打开

    O_RDWR:可读可写打开

    2)选项,用 | 或运算符拼接

    O_CREAT:若文件不存在则创建,必须提供第三个参数mode指定文件访问权限

    O_EXCL:若同时指定O_CREAT且文件已存在,返回出错

    O_TRUNC:若文件存在且打开方式只读或可写,将其清空为0字节

    O_APPEND:追加。在文件末尾追加数据

    O_NONBLOCK:打开设备文件为非阻塞I/O

  • 阻塞与非阻塞

    1)如果open()不指定O_NONBLOCK,进程默认为阻塞:调用了阻塞的系统函数,进程进入睡眠状态,直到等待事情发生才运行。除了睡眠状态还有运行状态,运行状态有正在被调度执行就绪状态两种
    2)open()指定O_NONBLOCK则进入非阻塞状态,此时可用轮询方式进行监视,及不断试。

  • open()形参的 mode
    1)指定文件权限,可用8进制数表示

    2)例如S_IRUSR表示八进制数00400, S_IRGRP表示八进制数00040, S_IROTH表示八进制数00004

    前2位固定,第三位为user权限即wrx,第四位为group权限,第五位为others权限


Linux的umask命令

  • open()函数设置mode文件权限的时候,会在umask的数值为1所在位进行面具遮掩,即此位不能修改。可设置umask 0解除所有的限制

close()

  • 关闭一个打开的文件。成功返回0,失败返回-1并设置errno
#include <unistd.h>
int close(int fd);

read() write()

  • 打开的设备或文件中 读取/写 数据。成功返回 读取/写 字节数,失败返回-1并设置errno
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, void *buf, size_t count);

lseek()

  • 与库函数fseek()类似。记录当前文件读写位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
  • 函数参数 whence: 1) SEEK_SET 表示文件开头 2)SEEK_CUR 表示当前位置 3)SEEK_END 表示文件结尾

fcntl()

  • 改变一个打开文件属性,如读写追加非阻塞标志,无须重新open
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock); //flock上锁
int fcntl(int fd, int cmd, ...);

流重定向

  • > : 重定向可写
  • < : 重定向可读
  • >>: 重定向追加可写
  • <<: 重定向追加可读
  • <>: 重定向可读可写

ioctl()

  • 向设备发控制和配置命令。出错返回-1
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
  • d表示某个设备文件描述符

    request表示ioctl命令


mmap()

  • 把磁盘的一部分直接映射到内存,即文件相应位置有对应内存地址。可摆脱read/write函数直接用指针进行文件读写
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int port, int flag, int filedes, off_t off);
int munmap(void *addr, size_t len);

ext2文件系统


stat (2)

  • 读取文件的inode。根据传入的文件路径找到inode填入stat结构体
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);

dup() dup2()

  • 复制一个现存的文件描述符,使2个文件描述符指向同一个file结构体
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd); //使newfd重定向到oldfd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值