I/O系统调用

常用系统调用

open

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

int open(const char *pathname, int flags, mode_t mode);
参数:
    pathname:文件的路径及文件名
    flags:O_RDONLY, O_WRONLY, O_RDWR
    mode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的权限,一般是0644
返回值:
    成功:成功返回打开的文件描述符
    失败:-1

flags详细说明

必选项:O_RDONLY, O_WRONLY, O_RDWR

可选项:

取值 含义
O_CREAT 文件不存在则创建文件,使用此选项时需使用mode说明文件的权限
O_EXCL 如果同时指定了O_CREAT,且文件已经存在,则出错。使O_CREAT成为原子操作,导致多个进程只能有一个进程成功打开文件。
O_TRUNC 如果文件存在,则清空文件内容
O_APPEND 写文件时,数据添加到文件末尾
O_NONBLOCK 对于设备文件, 以O_NONBLOCK方式打开可以做非阻塞I/O

新建文件的用户ID就是进程的有效用户ID,组ID可以是进程的有效组ID,也可以是新文件所在目录的组ID。

close

include <unistd.h>
int close(int fd);
返回值:
    成功:0
    失败: -1, 并设置errno

write

include <unistd.h>
size_t write(int fd, const void *buf, size_t count);
功能:
    把指定数目的数据写到文件(fd)
参数:
    fd :  文件描述符
    buf : 数据首地址
    count : 写入数据的长度(字节)
返回值:
    成功:实际写入数据的字节个数
    失败: - 1

read

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:
    把指定数目的数据读到内存(缓冲区)
参数:
    fd : 文件描述符
    buf : 内存首地址
    count : 读取的字节个数
返回值:
    成功:实际读取到的字节个数,若文件没有那么多字节,则返回值比count小
    失败: - 1

lseek

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
功能:
    改变文件的偏移量, read和write都会更改偏移量,偏移量最大为超尾。
    pread和pwrite不改变偏移量,pread和pwrite相当于lseek+read/write,但lseek不更改偏移量。
参数:
    fd:文件描述符
    offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数。
    	如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,		 再次写入时将增大文件尺寸。
    whence:其取值如下:
        SEEK_SET:从文件开头移动offset个字节
        SEEK_CUR:从当前位置移动offset个字节
        SEEK_END:从文件末尾移动offset个字节
返回值:
    若lseek成功执行, 则返回新的偏移量
    如果失败, 返回-1
posted @ 2022-01-16 17:11  hellozhangjz  阅读(98)  评论(0编辑  收藏  举报