linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl

本节目标:

1,文件共享2,复制文件描述符(dup、dup2、fcntl)

一,香港空间,香港服务器租用,文件共享

1,一个进程打开两个文件内核数据结构

说明:

文件描述符表:每个进程都有一张,彼此独立,每个文件描述符表项都指向一个文件表,文件描述符0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),默认已经打开,分别表示:标准输入,标准输出,标准错误设备。

文件表:每打开一个文件就对应一张文件表,文件表可以共享,当多个文件描述符指向同一个文件表时,文件表中的

refcnt字段会相应变化。文件状态标识:文件的打开模式(R,W,RW,APPEND,NOBLOCK,等),当前文件偏移量,refcnt:被引用数量,

v节点指针:指向一个v节点表。

v节点表:每个文件对应一个,无论被被多少个进程打开都只有一个,它包括v节点信息(主要是stat结构体中的信息),i节点信息。

每个进程默认只能打开1024个文件描述符,当一个进程打开一个文件时,默认会从0开始查找未被使用的描述符,美国空间,由于0,1,2默认被占用,所有一般从3开始使用。

2、一个进程两次打开同一个文件

当一个进程多次打开同一个文件时,首先会在描述符表顺序查找未被使用的描述符,然后每打开一次建立一张文件表,但各文件表中的v节点指针都指向同一个v节点表。

示例程序:

#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)int main(int argc, char *argv[]){int fd1;int fd2;char buf1[1024] = {0};char buf2[1024] = {0};fd1 = open(, O_RDONLY);if (fd1 == -1)ERR_EXIT();read(fd1, buf1, 5);printf(, buf1);fd2 = open(, O_RDWR);if (fd2 == -1)ERR_EXIT();read(fd2, buf2, 5);printf(, buf2);write(fd2, , 5);memset(buf1, 0, sizeof(buf1));read(fd1, buf1, 5);printf(, buf1);close(fd1);close(fd2);return 0;}学做任何事得按部就班,急不得

linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl

相关文章:

你感兴趣的文章:

标签云: