----今天接着昨天的话题讲,在昨天的文章里面,我们讲到了文件共享有三种实现方式,其中一种实现方式就是我们今天要讲的dup和dup2函数来实现了;那么咋们也就不废话 了,直接直奔主题吧。
一、dup函数解析:
1)首先我对这个dup函数的用法也不熟,所以说用man手册来查,这是最好的学习方法(或者网上查,有一大波博客会有讲这个的用法,但就我个人而言,还是要养成自己去探索一个新东西的习惯),看下图:

注解:这里主要是说了dup函数在旧的文件描述符复制会返回一个新的文件描述符,并且这个新的文件描述符是在连续接着旧的文件描述(比如旧的文件描述符是3,新的文件描述符则是4)。下面我们还是来看代码示例和试验现象:
代码语言:javascript代码运行次数:0运行复制<code class="javascript">#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define FILENAME "a.txt"int main(void){int fd1 = -1, fd2 = -1;fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644);if (fd1 < 0) { perror("open"); return -1; }printf("fd1 = %d.\n", fd1);fd2=dup(fd1);printf("fd1=%d.\n",fd2);close(fd1);return -1;}</code>
2、dup返回的fd和原来的oldfd都指向oldfd打开的那个【动态文件】,操作这两个fd实际操作的都是oldfd打开的那个文件。实际上构成了文件共享。和昨天一样,我们看一下对同一个文件操作,它是接续写还是分别写:
代码语言:javascript代码运行次数:0运行复制<code class="javascript">#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define FILENAME "a.txt" int main(void) { int fd1 = -1, fd2 = -1; fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644); if (fd1 < 0) { perror("open"); return -1; } printf("fd1 = %d.\n", fd1); fd2=dup(fd1); printf("fd1=%d.\n",fd2); while(1) { write(fd1,"ab",2); sleep(1); write(fd2,"cd",2); } close(fd1); return -1;}</code>
二、dup2函数解析:
1、相比于dup函数,dup2函数它的优势就是可以指定新的文件描述符的大小,用法比较灵活。我来看一个代码示例和试验现象:
代码语言:javascript代码运行次数:0运行复制<code class="javascript">#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define FILENAME "a.txt"int main(void){int fd1 = -1, fd2 = -1;fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644);if (fd1 < 0){ perror("open"); return -1;}printf("fd1 = %d.\n", fd1);fd2 = dup2(fd1, 16);printf("fd2 = %d.\n", fd2); close(fd1);return -1; }</code>
2、dup2和dup函数一样对文件写操作都是接续写的,这里我就不做演示了,写法和dup函数一样。上面的源代码链接:https://github.com/1121518wo/linux-/tree/master
三、Linux系统下管道符和重定向的学习补充:
这里可以参考刘遄老师写的
以上就是linux系统下dup和dup2函数解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号