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);

这个代码片段试图在C语言环境实现将当前日期写入到`date.txt`文件,并查看文件内容的功能。但是代码存在一些错误和不必要的步骤: 1. `open("date.txt") close(1);` 这里尝试打开并立即关闭文件描述符1(通常代表标准输入),然后再次尝试打开文件`date.txt`,但这行代码有问题,因为`close(1)`操作是对标准输入的关闭,而不是对`date.txt`。 2. `dup(fid);` 这行是复制文件描述符,但它在这段代码的作用并不明确。如果`fid`是要写入的文件描述符,那么这应该是为了保留原文件描述符以便后续读取,但在你提供的上下文,这不是必需的。 3. `close(fid);` 再次关闭`fid`可能覆盖了原本用于写入的数据。 4. `exec*` 函数用于执行系统命令,但这里拼写不完整(应该是`execlp`),并且`"date"`作为命令直接写在字符串里可能会存在问题,因为它不会包含路径信息。正确的用法应该指定完整的命令加上路径,如`execlp("/bin/date", "date", NULL);` 5. 最后一行 `cat date.txt` 也是在尝试执行`cat`命令显示文件内容,同样需要正确使用`execlp`函数。 正确的代码实现可能如下: ```c #include <stdio.h> #include <stdlib.h> int main() { // 打开文件以追加模式 int fd = open("date.txt", O_WRONLY | O_APPEND | O_CREAT, 0644); if (fd == -1) { perror("Error opening file"); return 1; } // 调用系统date命令写入当前时间 char cmd[] = "/usr/bin(date) > /dev/null"; // 使用/dev/null忽略输出 execlp(cmd, cmd, NULL); if (errno != ENOENT && errno != EACCES) { // 检查是否找不到命令 perror("Error executing 'date'"); close(fd); return 1; } // 关闭文件 close(fd); // 读取并显示文件内容 fd = open("date.txt", O_RDONLY); if (fd == -1) { perror("Error reading file"); return 1; } char buffer[1024]; ssize_t bytes_read = read(fd, buffer, sizeof(buffer)); printf("%s", buffer); // 关闭文件 close(fd); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小相619

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值