六、Linux系统编程-文件和IO(四)文件共享、复制文件描述符
2015-03-10 22:13
639 查看
一、文件共享
每个进程都有一个自己的文件描述符表。在一个进程中,一个文件被打开之后,会分配一个文件描述符,一个文件表表项,一个v节点表。其中文件表保存文件状态,包括:读、写、追加、同步、非阻塞等。其中文件表项是不能共享的,文件被打开一次,就会分配一个文件表项;v节点表示可以共享的,两个不同的文件表项可以指向同一个v节点表。
(1)、一个进程打开两个文件模型:
(2)、一个进程两次打开同一个文件
我们可以通过例子证明上面的模型,示例:
(3)、两个进程打开同一个文件
两个进程打开一个文件描述符可以相同,因为每个进程都有自己的文件描述符表。示例:
in:3
out:3
文件描述符相同,说明每个进程都有自己的文件描述符表。
(4)、复制文件描述符
复制之前:
复制之后:
可以通过复制文件描述符实现输出重定向到文件,示例:
每个进程都有一个自己的文件描述符表。在一个进程中,一个文件被打开之后,会分配一个文件描述符,一个文件表表项,一个v节点表。其中文件表保存文件状态,包括:读、写、追加、同步、非阻塞等。其中文件表项是不能共享的,文件被打开一次,就会分配一个文件表项;v节点表示可以共享的,两个不同的文件表项可以指向同一个v节点表。
(1)、一个进程打开两个文件模型:
(2)、一个进程两次打开同一个文件
我们可以通过例子证明上面的模型,示例:
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) int main() { int fd1,fd2; char buf[1024]; fd1 = open("aa.txt",O_RDWR); if (fd1 == -1) ERR_EXIT("open error"); read(fd1,buf,5); printf("read1:%s\n",buf); fd2 = open("aa.txt",O_RDWR); if(fd2 == -1) ERR_EXIT("open error"); read(fd2,buf,5); printf("read2:%s\n",buf); write(fd1,"AAAaa",5); read(fd2,buf,5); printf("read fd2:%s\n",buf) close(fd1); close(fd2); return 0; }执行结果:
s@ubuntu:~/sys$ cat aa.txt abcdeAAAaa s@ubuntu:~/sys$ gcc open2.c s@ubuntu:~/sys$ ./a.out read1:abcde read2:abcde read fd2:AAAaa s@ubuntu:~/sys$说明一个进程打开两次的相同文件会有两个文件表项,但是共享v节点。
(3)、两个进程打开同一个文件
两个进程打开一个文件描述符可以相同,因为每个进程都有自己的文件描述符表。示例:
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) #define MAJOR(a) (int)((unsigned short)a>>8) #define MINOR(a) (int)((unsigned short)a & 0xFF) int filetype(struct stat *buf); int main(int argc,char* argv[]) { int infd; int outfd; int ret; if ((ret = fork()) > 0) { infd = open("aa.txt",O_RDONLY); printf("in:%d\n",infd); } else { outfd = open("aa.txt",O_WRONLY); printf("out:%d\n",outfd); } wait(&ret); return 0; }结果:
in:3
out:3
文件描述符相同,说明每个进程都有自己的文件描述符表。
(4)、复制文件描述符
复制之前:
复制之后:
可以通过复制文件描述符实现输出重定向到文件,示例:
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) int main() { int fd; fd = open("aa.txt",O_WRONLY); if (fd == -1) ERR_EXIT("open error"); close(1); dup(fd);//等价于dup2(fd,0); printf("Hello\n"); return 0; }结果"Hello"没有输出到屏幕,而是输出到文件,因为此时标准输出文件描述符1已经指向打开文件aa.txt。
相关文章推荐
- linux系统编程之文件与IO(一):文件描述符、open,close
- linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl
- linux系统编程之文件与IO(四):目录访问相关系统调用
- linux系统编程之文件与IO:stat()系统调用获取文件信息
- linux系统编程之文件与io(二)
- linux系统编程之文件与io(三)
- linux系统编程之文件与io(四)
- linux系统编程之文件与io(五)
- Linux学习记录--文件IO操作相关系统编程
- Linux学习记录--文件IO操作相关系统编程
- 【Linux系统编程】文件IO操作
- Linux下编程------文件与IO(三) 文件共享和fcntl函数
- linux应用编程笔记(5)系统调用文件编程方法实现文件复制
- linux系统编程之文件IO
- Linux学习记录--文件IO操作相关系统编程
- Linux系统编程——文件描述符的复制:dup()和dup2()
- Linux系统编程:简单文件IO操作
- linux系统编程 - 文件复制程序
- LINUX 系统编程之文件IO
- Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)