linux中的文件IO笔记 3

3.1.11 文件描述符的复制1
        1、dup和dup2函数介绍
          #include <unistd.h>

          int dup(int oldfd);
            int dup2(int oldfd, int newfd);

            #define _GNU_SOURCE             /* See feature_test_macros(7) */
            #include <fcntl.h>              /* Obtain O_* constant definitions */
            #include <unistd.h>

            int dup3(int oldfd, int newfd, int flags);
        dup系统调用有一个特定,就是不能指定 复制后得到的fd的数字是多少,而是由操作系统自动分配的。
        dup返回的fd和原来的oldfd都指向oldfd打开的动态文件,操作这两个fd实际操作的都是oldfd打开的那个文件,实际上构成了文件共享。
        
        是分别写还是接续写?
    3、使用dup的缺陷分析
        dup并不能指定分配的新的文件描述字符。
    4、练习
        close(1)关闭标准输出,printf的内容就看不到了。
        这时候使用dup就可以将输出绑定到标准输出
        使用;close和dup配合进行文件的重定位。
3.1.12 文件描述符的复制2
    1、使用dup2进行文件描述符复制
        dup2和dup的 作用一样,都是复制一个新的文件描述符,但是dup2允许用户指定新的文件描述字符。
    2、dup2共享文件交叉写入测试
        dup2复制的文件描述符,和原来的文件描述符虽然数字上不一样,但是这两个指向同一个打开的文件。
        交叉写入的时候,结果是接续写(实验证明的)。
    3、命令行中重定位命令
        1、linux中的shell命令执行后,打印结果都是默认进入标准输出的。
        (本质上这些命令譬如ls pwd 都是调用printf进行打印的)
        2、能否想办法把ls,pwd等命令输出结果重定位到一个文件中去,实际上linux中断支持一个重定位文件符号>很简单可以做到这一点。
            ls > 1.txt 把ls 输出结果重定位到1.txt中去
        3、利用 open+close+dup,open打开一个文件2.txt.
3.1.13 fcntl函数介绍
    1、fcntl原型与作用
       #include <unistd.h>
       #include <fcntl.h>

       int fcntl(int fd, int cmd, ... /* arg */ );
        多功能工具箱,fd:文件标识符
        一个多功能文件管理工具箱,接收2个参数+1个变参
        cmd:表示要进行那个命令操作
   2、fcntl的常用cmd
        F_DUPFD复制文件描述符
         F_DUPFD返回的是>= arg最小的哪一个数字。
3.1.14 标准IO库的介绍
    1、标准IO和文件IO有什么区别
        标准IO是C库函数
        文件IO是linux系统的API
        C 语言库函数是由API封装而来的,库函数内部也是通过调用API来完成操作的。
        但是库函数多了一层封装,所以比API更加女好用一些。
        
        库函数比API 函数更加有优势:API在不同操作系统之间是不能通用的,但是C库函数在不同
        操作系统中几乎是一样的。
        性能和易用性上看,C库函数一般要好一些。
         
    2、常用标准IO函数介绍    
        常见的标准IO库函数有:fopen fclose fwrite fread ffulsh、fseek
    3、一个简单的标准IO读写文件实例
       FILE *fopen(const char *path, const char *mode);

       FILE *fdopen(int fd, const char *mode);

       FILE *freopen(const char *path, const char *mode, FILE *stream);

上一篇:Element中 resetFields()方法不生效


下一篇:通过dup2实现linux命令回显的捕获