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