第七章 文件与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)相同的文件状态标识。

原文地址:https://www.cnblogs.com/s3320/p/11329390.html

时间: 2024-08-30 13:21:05

第七章 文件与I/O(4)的相关文章

第七章 文件的操作

@文件文档操作 用open()打开. open(“文件”,格式) 格式有只读(r),只写(w),读写(r+),或者写读(w+):r+是读写,是文件中比较常用的类型. 创建并写入文件. 或者直接写入文件. 读取文件全部内容:文件.read() 读取每一行:文件.readline() 读取所有行数:文件.readlines() 文件在写入过程中,所写入的数据没有保存的话是读取不出来的:所以需要close()关闭或者flush()刷新操作,才能正常读取所写入的数据. 模块pickle的用法: 在读取文

第七章、epub文件处理 -- 解析 .xhtml文件 (一)

第七章.epub文件处理 -- 解析 .xhtml文件 (一) 本章将介绍代码如何利用ZLTextPlainModel类来分别处理.xhtml文件中的文本信息与标签信息. 本章涉及的核心类是ZLTextPlainModel类.ZLTextWritablePlainModel类.CachedCharStorage类.XHTMLTagAction接口实现类 .xhtml文件中包含着两种信息:文本信息与标签信息.我们需要先正确解析出标签信息代表的结构,才能正确得将文本信息显示在屏幕上. 举个例子:(这

linux &nbsp; 第七章 磁盘和文件系统管理(一)

linux 第七章磁盘和文件系统管理(一) 享受生活 热爱挑战 明远分享 每章一句话: 在别人光鲜的背后有着太多太多,别人不知道的痛苦,自己不喜欢的人,以微笑面对,默默地为他祝福:对于喜欢的人,真情流露,真诚相待.人在做天在看,冥冥中自有因果安排,永远保持一颗善良的心,持续做对的事情,不断地提醒自己,低调做人,高调做事. 要求:    跟着做一下吧 看不清图片就点一下图片 一,关机后添加一块20GB的SCSI磁盘,重新开机进入RHEL 5系统 二,分区并格式化 1, 使用fdisk命令对新硬盘进

【转】第七章、Linux 文件与目录管理

原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php 第七章.Linux 文件与目录管理 最近升级日期:2009/08/26 在第六章我们认识了Linux系统下的文件权限概念以及目录的配置说明. 在这个章节当中,我们就直接来进一步的操作与管理文件与目录吧!包括在不同的目录间变换. 创建与删除目录.创建与删除文件,还有寻找文件.查阅文件内容等等, 都会在这个章节作个简单的介绍啊! 1. 目录与路径 1.1 相对路径与绝对路

鸟哥的Linux私房菜_基础版_学习笔记3:第七章 Linux文件与目录管理

第七章 Linux文件与目录管理 7.1目录与路径: 7.1.1相对路径与绝对路径: 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录. 相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:『cd ../man』这就是相对路径的写法啦!相对路径意指『相对於目前工作目录的路径!』 7.1.2目录的相关操作: . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录

第七章

第七章 控制发光二极管. 尽管linux 驱动直接和硬件打交道,但并不是linux驱动直接向硬件中的内存写数据,而是与本机的i/o内存进行交互.所谓I/O内存是通过各种接口(PCI, USB.蓝牙以太网等)连接到主机的硬件在主机的内存映射.Linux内核提供了多个与I/O内存交互的函数.Linux内核的内存管理模块负责同步I/O内存与硬件的数据. 每一个连接Linux 的硬件在I/O内存中都会有映射首地址.在使用ioread 32.ioread32等函数读写I/O内存时需要指定这些首地址.Led

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 提供ROS接口的3D软件比较多,本章以最典型的Gazebo介绍为主,从Player/Stage/Gazebo发展而来,现在独立的机器人仿真开发环境,目前2016年最新版本Gazebo7.1配合ROS(kinetic)使用. 补充内容:http://blo

JavaScript DOM编程艺术-学习笔记(第七章)

第七章: 1.dom方法创建并且插入标签:(这种方法并没有改变文档的物理内容,而是在改变dom树) ①创建元素节点:createElement(); ②内部前插入:appendChild() ③创建文本节点:createTextNode(); ④设置属性节点:setAttribute(); ⑤外部前插入:父元素.insertBefore(插入的元素,目标元素);                  插入的元素被插入到,目标元素的前面. ⑥没有inserAfter()函数. 2.小知识点:①appe