第七章 文件与I/O(4)
文件共享
打开文件内核数据结构
一个进程两次打开同一个文件
一个进程能打开1024个文件描述符,没打开一个文件,内核会生成一个文件表,文件表中的v节点指针指向v节点表,v节点部分信息就是stat函数返回的信息,i节点信息,当我们打开一个文件的时候,会将文件系统中i节点信息拷贝到v节点信息对应的i节点信息中(i节点号,文件存在那一块中,)
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
int main(int argc, char* argv[])
{
int fd1,fd2;
char readbuf1[1024] = {0};
char readbuf2[1024] = {0};
//open会打开文件表,文件表会记录当前文件的状态标志,当前文件的偏移量,引用计数,v节点指针,
//每个fd都是独立的,所以偏移量这些也是唯一的,不会影响其他fd的偏移量
fd1 = open("test.txt",O_RDONLY);
if(fd1 == -1)
ERR_EXIT("open");
read(fd1, readbuf1, 4);
printf("readbuf1 = %s\n",readbuf1);
//open会新开文件表
fd2 = open("test.txt",O_RDWR);
if(fd2 == -1)
ERR_EXIT("open");
read(fd2, readbuf2, 4);
printf("readbuf2 = %s\n",readbuf2);
//写入数据后,v节点中的i节点对应硬盘中的数据改变了
write(fd2,"AAAAA",6);
memset(readbuf1, 0, sizeof(readbuf1));
read(fd1, readbuf1, 6);
printf("readbuf1 = %s\n",readbuf1);
close(fd1);
close(fd2);
return 0;
}
两个进程打开同一个文件
复制文件描述符(dup、dup2、fcntl)
dup
功能:
创建一份oldfd的拷贝,使用最小的可用的文件描述符作为新的文件描述符。
int dup(int oldfd);
参数:
oldfd : 文件描述符
返回值:
成功:返回新的文件描述符
出错:返回-1.注意:由dup函数返回的新文件描述符一定是当前可用文件描述符中的最小值。
输出重定向
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
int main(int argc, char* argv[])
{
int fd1;
fd1 = open("test2.txt", O_WRONLY);
if(fd1 == -1)
ERR_EXIT("open");
close(1);
dup(fd1);
printf("hello\n");
//等同于上面的代码
//dup2(fd1,1);
close(fd1);
return 0;
}
dup2
功能:
dup2用来复制参数oldfd所指的文件描述符,并将oldfd拷贝到参数newfd后一起返回。强制使用新的文件描述来复制,不管原来的文件描述符是否空闲
- 若参数newfd为一个打开的文件描述符,则newfd所指的文件会先被关闭,
- 若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。
- dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等等.
int dup2(int oldfd, int newfd);
参数:
oldfd : 文件描述符
newfd : 文件描述符
返回值:
成功: 返回新的文件描述符
出错: 返回-1. 注意:由dup2函数返回的新文件描述符一定是当前可用文件描述符中的最小值。
newfd和oldfd具有的共同点:
(1)相同的打开文件(管道)。
(2)相同的文件指针,即两个文件共享一个文件指针。
(3)相同的访问模式。读取、写入。
(4)相同的文件状态标识。
第七章 文件与I/O(4)的更多相关文章
- [Python学习笔记][第七章Python文件操作]
2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...
- 【转】第七章、Linux 文件与目录管理
原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php 第七章.Linux 文件与目录管理 最近升级日期:2009/08/26 ...
- 第七章、Linux 文件与目录管理
第七章.Linux 文件与目录管理 1. 目录与路径 1.1 相对路径与绝对路径 1.2 目录的相关操作: cd, pwd, mkdir, rmdir 1.3 关於运行档路径的变量: $PATH ...
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
- 第七章 LED将为我们闪烁:控制发光二极管
第七章 LED将为我们闪烁:控制发光二极管 本章我们将会看到一个完整的linux驱动程序,通过linux驱动程序控制LED的四个小灯,通俗的说就是通过向linux驱动程序来控制LED小灯的开关.用到 ...
- apue第七章学习总结
apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...
- Laxcus大数据管理系统2.0(9)- 第七章 分布任务组件
第七章 分布任务组件 Laxcus 2.0版本的分布任务组件,是在1.x版本的基础上,重新整合中间件和分布计算技术,按照新增加的功能,设计的一套新的.分布状态下运行的数据计算组件和数据构建组件,以及依 ...
- C primer plus 读书笔记第六章和第七章
这两章的标题是C控制语句:循环以及C控制语句:分支和跳转.之所以一起讲,是因为这两章内容都是讲控制语句. 第六章的第一段示例代码 /* summing.c --对用户输入的整数求和 */ #inclu ...
- 第七章——DMVs和DMFs(4)——用DMV和DMF监控磁盘IO
原文:第七章--DMVs和DMFs(4)--用DMV和DMF监控磁盘IO 前言: 本文为本系列最后一篇,作为DBA,你必须经常关注磁盘的I/O问题,一旦出现问题,要尽快分析出是什么问题.SQLServ ...
随机推荐
- 夯实Java基础系列14:深入理解Java枚举类
目录 初探枚举类 枚举类-语法 枚举类的具体使用 使用枚举类的注意事项 枚举类的实现原理 枚举类实战 实战一无参 实战二有一参 实战三有两参 枚举类总结 枚举 API 总结 参考文章 微信公众号 Ja ...
- Yii2.0怎么设置时区?
在config文件夹下,main.php 中, return [ 'charset' => 'utf-8', 'language' => 'zh-CN', 'timeZone' => ...
- php 正则判断是否是手机号码 最新
php 正则判断是否是手机号码 最新 标签: php正则 2013-09-22 14:31 55076人阅读 评论(1) 收藏 举报 分类: php(42) 版权声明:本文为博主原创文章,若转载请 ...
- Android资源管理利器Resources和AssetManager
前言 : Android工程在运行的时候往往需要引用资源.使用 Resources 来获取 res 目录下的各种与设备相关的资源.而使用 AssetManager 来获取 assets 目录下的资源 ...
- 三天讲透SpringBoot-初识基础使用
这次我们来说一下我们的SpringBoot,现在SpringBoot已经成为趋势,在我这里我用三篇文章的形式来讲清楚我们的SpringBoot,大致分为,第一篇讲搭建,基本使用,第二篇三方集成,自动装 ...
- 「面试高频」二叉搜索树&双指针&贪心 算法题指北
本文将覆盖 「字符串处理」 + 「动态规划」 方面的面试算法题,文中我将给出: 面试中的题目 解题的思路 特定问题的技巧和注意事项 考察的知识点及其概念 详细的代码和解析 开始之前,我们先看下会有哪些 ...
- 【TencentOS tiny】 超详细的TencentOS tiny移植到STM32F103全教程
移植前的准备工作 1. 获取STM32的裸机工程模板 STM32的裸机工程模板直接使用野火STM32开发板配套的固件库例程即可.可以从我github上获取https://github.com/jiej ...
- hihoCode 1075 : 开锁魔法III
时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅 ...
- Cutting Sticks UVA - 10003
题文: 见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- Python制作有道翻译小工具
该工具主要是利用了爬虫,爬取web有道翻译的内容. 然后利用简易GUI来可视化结果. 首先我们进入有道词典的首页,并点击翻译结果的审查元素 之后request响应网页,并分析网页,定位到翻译结果. 使 ...