Linux系统调用函数read和write

版权声明:欢迎转载,不必客气。 https://blog.csdn.net/CSDN_FengXingwei/article/details/83750177

read函数

原型

#include<unistd.h>
ssize_t read(int fd, void *buf,size_t count);

描述

  从打开的设备或文件中读取数据。
  read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
  如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。

返回值

  返回值类型是ssize_t,表示有符号的size_t,这样既可以返回正的字节数、0(表示到达文件末尾)、也可以返回负值-1(表示出错)。

错误代码

EINTR 	此调用被信号所中断。
EAGAIN 	当使用不可阻断I/O 时(O_NONBLOCK == 非阻塞),若无数据可读取则返回此值。
EBADF 	参数fd 非有效的文件描述词,或该文件已关闭。

write函数

原型

#include<unistd.h>
ssize_t write (int fd, void *buf, size_t count);

描述

  向打开的设备或文件中写数据。write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。

返回值

  如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。

错误代码

EINTR 	此调用被信号所中断。
EAGAIN 	当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EADF 	参数fd非有效的文件描述词,或该文件已关闭。

拷贝文件实例

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#define BUFFER_SIZE 1024

int main(int argc, char **argv) {
    int from_fd, to_fd;
    int bytes_read, bytes_write;
    char buffer[BUFFER_SIZE];
    char *ptr;
    if (argc != 3) {
        fprintf(stderr, "Usage:%s fromfile tofile\n\a", argv[0]);
        exit(1);
    }
    /* 打开源文件 */
    if ((from_fd = open(argv[1], O_RDONLY)) == -1) {
        fprintf(stderr, "Open %s Error:%s\n", argv[1], strerror(errno));
        exit(1);
    }
    /* 创建目的文件 */
    if ((to_fd = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1) {
        fprintf(stderr, "Open %s Error:%s\n", argv[2], strerror(errno));
        exit(1);
    }
    /* 以下代码是一个经典的拷贝文件的代码 */
    while (bytes_read = read(from_fd, buffer, BUFFER_SIZE)) {
        /* 一个致命的错误发生了 */
        if ((bytes_read == -1) && (errno != EINTR)) break;
        else if (bytes_read > 0) {
            ptr = buffer;
            while (bytes_write = write(to_fd, ptr, bytes_read)) {
                /* 一个致命错误发生了 */
                if ((bytes_write == -1) && (errno != EINTR))break;
                    /* 写完了所有读的字节 */
                else if (bytes_write == bytes_read) break;
                    /* 只写了一部分,继续写 */
                else if (bytes_write > 0) {
                    ptr += bytes_write;
                    bytes_read -= bytes_write;
                }
            }
            /* 写的时候发生的致命错误 */
            if (bytes_write == -1)break;
        }
    }
    close(from_fd);
    close(to_fd);
    exit(0);
}

猜你喜欢

转载自blog.csdn.net/CSDN_FengXingwei/article/details/83750177