系统编程之高级文件IO(十)——文件描述符操作(重定向)

简介: 系统编程之高级文件IO(十)——文件描述符操作(重定向)

一、换个使用glibc函数与系统调用


C标准库提供了实现两者间相互转换的函数


int fileno(FILE *fp)

把文件指针转换成文件描述符

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

把文件描述符转换成文件指针


int main(int argc, char **argv)
{
  int fd = open(argv[1], O_REWR | O_CREAT, 0655);
  FILE *fp = fdopen(fd, "a+");
  char buffer[1024];
  fputs("hello", fp);
  fd = fileno(fp);
  lseek(fd, 0, SEEK_SET);
  int n_r = read(fd, buffer, sizeof(buffer));
  fclose(fp);
}


二、文件描述符复制(重定向)


2.1 dup


int dup(int oldfd);

当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。

int new_fd = dup(fd);
  write(new_fd, "hello world", 11);
  close(new_fd);


调用dup(oldfd)等效于,fcntl(oldfd, F_DUPFD, 0)


2.2 dup2


int dup2(int oldfd, int newfd);

dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开, 则先将其关闭。

如果newfd等于oldfd,则dup2返回newfd,而不关闭它。

dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项

调用dup2(oldfd, newfd)等效于,close(newfd); fcntl(oldfd, F_ DUPFD, newfd):


0a2653c851af460fa595bd959398a8f1.png2d65d23f6d4748949b924e4057485923.png


三、应用


网络重定向


相关文章
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2月前
|
数据库
同步IO模型是一种常见的编程模型
【10月更文挑战第5天】同步IO模型是一种常见的编程模型
23 2
|
2月前
|
搜索推荐 索引
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
40 2
|
2月前
|
编解码 Java 程序员
【文件IO】文件内容操作
【文件IO】文件内容操作
58 2
|
2月前
|
存储 Java API
【文件IO】文件系统操作
【文件IO】文件系统操作
51 1
|
2月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
39 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
5月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
242 12
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
52 2