一.多次打开文件
同一个文件可被打开多次,也就是可以在同一个进程中调用多次open()函数,则返回多个不同的描述符,内核对应打开多个记录文件信息的结构体,但是动态文件只会被加载到内存中一次,也就是说只会打开一个动态文件。多个不同的描述符都指向同一个文件,但是每个描述符所对应的偏移量是独立的。
二.复制文件描述符
通过函数进行描述符的复制,在进程中使用一次open()函数打开文件,在调用函数进行描述符的复制。而通过该方式复制出的描述符都指向同一块文件,并且描述该文件的信息也是相同的,包括偏移量。也就是所偏移量不是独立的,以及其他的信息。
三.dup/dup2
1.int dup(int oldfd)
功能:复制文件描述符并占领最小未使用的描述符
返回值:返回新的描述符
int main(void)
12 {
13 int fd;
14 //close(1);
15 fd = open(FNAME,O_WRONLY|O_CREAT|O_TRUNC,00600);
16 if(fd < 0)
17 {
18 perror("open()");
19 exit(1);
20 }
21 close(1);
22 dup(fd);
23 close(fd);
24
25 /************************************/
26 puts("ello world");
27 exit(0);
28 }
edu@edu:~/work$ cat Recive_bin
ello world
这里标准输出关掉,将打开的fd进行复制,则复制的fd将占领1号描述符,而打开的文件就是Recive_bin.所以通过cat查看文件内容则是 输出的内容。
2.int dup2(int oldfd, int newfd);
功能:指定一个新的fd作为旧fd的一个副本。若newfd已经存在则先关闭该存在的fd
int main(void)
12 {
13 int fd;
14 //close(1);
15 fd = open(FNAME,O_WRONLY|O_CREAT|O_TRUNC,00600);
16 if(fd < 0)
17 {
18 perror("open()");
19 exit(1);
20 }
21 // close(1);
22 dup2(fd,1);
23 if(fd != 1)
24 close(fd);
25
26 /************************************/
27 puts("llo world");
28 exit(0);
29 }
edu@edu:~/work$ cat Recive_bin
llo world