- 3.12 函数dup和dup2
- 函数定义:
1.需要注意dup(fd) 复制fd, 返回值是可用的文件描述符中的最小值。比如下面例子
close(1); int dupfd = dup(fd); // 复制fd,得到的dupfd是可用的最小fd 1
有如下简单例子:可见由于close(1); 关闭了标准输出,所以printf不会打印到终端。又因为dup(fd)的返回值为 1 ,所以printf会打印到fd对应的流里面去,表现的现象就是 cat /tmp/out 可以看到printf和 puts的内容。。
#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #define FNAME "/tmp/out" int main() { int fd = open(FNAME, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (fd < 0) { perror("open()"); exit(1); } close(1); int dupfd = dup(fd); // 复制fd,得到的dupfd是可用的最小fd 1 printf("hello %d %d", dupfd, fd); puts("hello"); // default 输出到stdout(fd == 1), 当close(1)后,输出到FNAME exit(0); }
2.dup2(fd, fd2); 相当于 close(fd2); + dup(fd); 只不过封装了起来作为原子操作。
close(1); int dupfd = dup(fd); // 复制fd,得到的dupfd是可用的最小fd 1 //上述两行代码等价于 int dupfd = dup2(fd, 1);
- 3.13 函数sync,fsync,fdatasync
为了解决缓冲区与实际文件系统的同步问题,提供了上述接口
sync(): 执行将修改过的缓冲区写入队列(针对所有的stream)然后返回,不等待写磁盘的操作结束。
fsync():只对fd指定的文件起作用,并且等待写磁盘的动作完成。
fdatasync() :只影响文件的数据部分。相比于fsync, fsync还会同步更新文件属性。
- 3.14 fcntl
函数定义:
- 3.15 ioctl
函数定义:设备相关内容
- 3.16 /dev/fd
/dev/fd是虚目录: ls -l /dev/fd/