文件I/O-open的使用详解.


/*
 * open, read, write, lseek, close... ...
 * 不同缓冲器长度对read和write函数的影响.
 * 不带缓冲I/O.
 * ANSI C
 * STDIN_FILENO  0
 * STDOUT_FILENO 1
 * STDERR_FILENO 2
 * 文件描述符范围 0~OPEN_MAX.
 * [注意]涉及多个进程间共享资源,原子操作的概念就非常重要.
 * 文件描述符是非负数.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* open */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, const char *argv[])
{
    /* O_REONLY 只读打开.
     * O_WRONLY 只写打开.
     * O_RDWR   读,写打开.
     */

    /* O_APPEND 追加文件的尾端.
     * O_CREATE 不存在创建.
     */
    
    /* O_EXCL 同时指定了O_CREAT,文件存在,则出错.
     * O_TRUNC 文件存在,而且为只读或只写成功打开,则长度截短为0.
     * O_NOCTTY 不将此设备分配作为此进程的控制终端.
     * O_NONBLOCK FIFO,一个块特殊文件或一个字符特殊文件,此文件本次打开和后续的I/O操作设置非阻塞方式.
     * O_SYNC write都等到物理i/o操作完成.
     */

    // 实验文件描述符.
    //close(STDIN_FILENO);    
    //close(STDOUT_FILENO);
    close(STDERR_FILENO); //关闭标准错误输出,fd的文件描述符是2.
    // dup2函数,给定的描述符上打开一个文件.

    int fd = open("1234567890abcdefg.txt", O_WRONLY | O_APPEND);//| O_TRUNC);

    if (fd == -1)
    {
        perror("open [Error]");
        exit(-1);
    }

    printf("文件描述符:%d\n", fd);
    char *test = "hello world!!";
    write(fd, test, strlen(test));
    //close(fd);
    fd = creat("abcd.txt", 0666);
    printf("文件描述符:%d\n", fd);
    //fd = open("abcd.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    close(fd);
    /* 文件名和路径名截短 */
    return 0;
}

/* 进程终止时,内核自动关闭所有开打文文件.
 * 关闭一个文件时也释放该进程加在该文件上
 * 的所有记录锁.
 */

你可能感兴趣的:(文件I/O-open的使用详解.)