----今天接着昨天的话题讲,在昨天的文章里面,我们讲到了文件共享有三种实现方式,其中一种实现方式就是我们今天要讲的dup和dup2函数来实现了;那么咋们也就不废话 了,直接直奔主题吧。

一、dup函数解析:

1)首先我对这个dup函数的用法也不熟,所以说用man手册来查,这是最好的学习方法(或者网上查,有一大波博客会有讲这个的用法,但就我个人而言,还是要养成自己去探索一个新东西的习惯),看下图:

linux系统下dup和dup2函数解析_linux

注解:这里主要是说了dup函数在旧的文件描述符复制会返回一个新的文件描述符,并且这个新的文件描述符是在连续接着旧的文件描述(比如旧的文件描述符是3,新的文件描述符则是4)。下面我们还是来看代码示例和试验现象:

1#include <stdio.h>
2#include <sys/types.h>
3#include <sys/stat.h>
4#include <fcntl.h>
5#include <unistd.h>
6#define FILENAME "a.txt"
7int main(void)
8{
9
10int fd1 = -1, fd2 = -1;
11
12fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644);
13if (fd1 < 0)
14 {
15 perror("open");
16 return -1;
17 }
18printf("fd1 = %d.\n", fd1);
19fd2=dup(fd1);
20printf("fd1=%d.\n",fd2);
21close(fd1);
22return -1;
23
24}

linux系统下dup和dup2函数解析_文件描述符_02

2​、​dup返回的fd和原来的oldfd都指向oldfd打开的那个【动态文件】,操作这两个fd实际操作的都是oldfd打开的那个文件。实际上构成了文件共享。和昨天一样,我们看一下对同一个文件操作,它是接续写还是分别写:

1#include <stdio.h>
2#include <sys/types.h>
3#include <sys/stat.h>
4#include <fcntl.h>
5#include <unistd.h>
6#define FILENAME "a.txt"
7 int main(void)
8 {
9 int fd1 = -1, fd2 = -1;
10
11 fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644);
12 if (fd1 < 0)
13 {
14 perror("open");
15 return -1;
16 }
17 printf("fd1 = %d.\n", fd1);
18 fd2=dup(fd1);
19 printf("fd1=%d.\n",fd2);
20 while(1)
21 {
22 write(fd1,"ab",2);
23 sleep(1);
24 write(fd2,"cd",2);
25 }
26 close(fd1);
27 return -1;
28}

linux系统下dup和dup2函数解析_#include_03

二、dup2函数解析:

1、相比于dup函数,dup2函数它的优势就是可以指定新的文件描述符的大小,用法比较灵活。我来看一个代码示例和试验现象:

1#include <stdio.h>
2#include <sys/types.h>
3#include <sys/stat.h>
4#include <fcntl.h>
5#include <unistd.h>
6#define FILENAME "a.txt"
7int main(void)
8{
9int fd1 = -1, fd2 = -1;
10
11fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644);
12if (fd1 < 0)
13{
14 perror("open");
15 return -1;
16}
17printf("fd1 = %d.\n", fd1);
18fd2 = dup2(fd1, 16);
19printf("fd2 = %d.\n", fd2);
20close(fd1);
21return -1;
22 }

linux系统下dup和dup2函数解析_文件描述符_04

2、dup2和dup函数一样对文件写操作都是接续写的,这里我就不做演示了,写法和dup函数一样。上面的源代码链接:​https://github.com/1121518wo/linux-/tree/master​

三、Linux系统下管道符和重定向的学习补充:

这里可以参考刘遄老师写的<linux就该这么学>这本书,写的非常好:​https://www.linuxprobe.com/chapter-03.html​


关注公众号:

linux系统下dup和dup2函数解析_#include_05