linuxC IO系统调用

 

IO系统调用

write

write把缓冲区buf前nbytes个字节写入到与文件描述符fd关联文件中, 返回实际写入字节数

size_t write(int fildes, const void *buf, size_t nbytes)
状态 返回值
正常写入 实际写入字节数
未写入数据 0
调用错误 -1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
	const size_t WRITE_INFO_LEN = 18;
    const size_t ERR_INFO_LEN   = 46;
    const char* WEITE_INFO = "Here is some data\n";
    const char* ERR_INFO   = "A write error has occurred on file descriptor 1 \n";
    // 向fd1(屏幕)写入
    if (write(STDOUT_FILENO, WEITE_INFO, WRITE_INFO_LEN) != WRITE_INFO_LEN) {
        write(STDERR_FILENO, ERR_INFO, ERR_INFO_LEN);
    }
    return 0;
}

运行结果

Here is some data

read

#include<unistd.h>

size_t read(int fildes, void *buf, size_t nbytes)

从文件描述符fildes相关联的文件里读入nbytes个字节数据, 并放到数据区buf中

情况 返回值
正常写入 实际读入字节数
未读入数据, 已经到达文件尾 0
调用错误 -1
  • 示例, 读取键盘输入显示在屏幕
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
	const int READ_INFO_LEN      = 128;
	const int READ_ERR_INFO_LEN  = 26;
	const int WRITE_ERR_INFO_LEN = 27;
    char buffer[READ_INFO_LEN];

    // 从fd0(键盘)中读入
    int readRes = read(STDIN_FILENO, buffer, READ_INFO_LEN);
    if (readRes == -1) {
        write(STDERR_FILENO, "A read error has occurred\n", READ_ERR_INFO_LEN);
    }
    // 向fd1(屏幕)写入
    int writeRes = write(STDOUT_FILENO, buffer, readRes);
    if (writeRes != readRes) {
        write(STDERR_FILENO, "A write error has occurred\n", WRITE_ERR_INFO_LEN);
    }
    return 0;
}

open

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

int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode);

创建新文件描述符, 调用成功后返回可以被read, write和其他系统调用那个使用的文件描述符

graph LR;
    X(oflags参数)
    X-->A(O_RDONLY)-->A1(只读方式打开)
    X-->B(O_WRONLY)-->B1(只写方式打开)
    X-->C(O_RDWR)-->C1(读写方式打开)
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main(void) {
    char block[1024];
    int nread;

    int in  = open("file.in", O_RDONLY);
    int out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
    while((nread = read(in, block, sizeof(block))) > 0) {
        write(out, block, nread);
    }
    return 0;
}

FILE

#ifndef _FILE_DEFINED
struct _iobuf {
    // 文件输入下一个位置
    char *_ptr;
    // 当前缓冲区相对位置
    int _cnt;
    // 文件起始位置
    char *_base;
    // 文件标志
    int _flag;
    // 文件描述符id
    int _file;
    // 检查缓冲区状况,若无缓冲区则不读取
    int _charbuf;
    // 文件缓冲区大小
    int _bufsiz;
    // 临时文件名
    char *_tmpfname;
};

typedef struct _iobuf FILE;

#define _FILE_DEFINED
#endif

FILE结构是间接地操作系统文件控制块(FCB)来实现对文件操作

接口

fopen

// 读文件到内存,返回文件信息结构指针
FILE *fopen(char *file, char *open_mode)