Linux学习笔记11——文件I/O之二

一、文件共享

  内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。

  1、每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述表
  2、内核为所有打开文件维持一张文件表
  3、每个打开文件都有一个v节点结构,v节点包含了文件类型和对此文件进行各种操作的函数的指针。PS:Linux中没有使用v节点,而是使用了通用i节点结构。

  

  文件描述符标志只用于一个进程的一个描述符

  文件状态标志适用于指向该给定文件表项的任何进程中的所有描述符

 

二、原子操作

  1、pread函数和pwrite函数

    #include <unistd.h>
    ssize_t pread(int fd,        //要读取数据的文件描述符

           void *buf,      //数据缓存区指针,存放读取出来的数据

           size_t nbytes,    //读取数据的字节数

           off_t offset      //读取的起始地址的偏移量,读取地址=文件开始+offset

           );          //返回值:读到的字节数,若已到文件结尾则返回0,若出错则返回-1

    ssize_t pwrite(int fd,          //要写入数据的文件描述符

           const void *buf,    //数据缓存区指针,存放要写入文件中的数据

           size_t nbytes,    //写入数据的字节数

           off_t offset      //写入起始地址的偏移量,写入地址=文件开始+offset

           );          //返回值:若成功则返回已写的字节数,若出错则返回-1

    调用pread相当于顺序调用lseek和read,但是调用pread时,无法中断其定位和读操作,且不更新文件指针。

    调用pwrite相当于顺序调用lseek和write。

  2、原子操作指的是由多步组成的操作,如果该操作原子地执行,则要么执行完所有步骤。要么一步也不执行,不可能只执行所有步骤的一个子集。

 

三、dup和dup2函数

    #include <unistd.h>
    int dup(int fd);           //返回的新文件描述符一定是当前可用文件描述符的最小数值
    int dup2(int fd,int fd2);         //用fd2参数指定新描述符的数值

    两个函数都可用来复制一个现存的文件描述符,两函数的返回值:若成功则返回新的文件描述符,若出错则返回-1。

    这两个函数的用处:返回的新文件描述符与参数fd共享一个文件表项,达到共享一个文件状态标志(读、写、添加等)以及同一当前文件偏移量。如下图所示:

 

四、sync、fsync和fdatasync函数

  虽然延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。sync、fsync和fdatasync函数可以保证磁盘上实际文件系统与缓冲区高速缓存中内存的一致性。

  #include <unistd.h>
  int fsync(int fd);
  int fdatasync(int fd);        //这两个函数的返回值:若成功则返回0,若出错则返回-1

  void sync(void);


  fsync :只对由文件描述符fd指定的单一文件起作用,并且等待写磁盘操作结束,然后返回
  fdatasync :只影响文件的数据部分,而除数据外,fsync还会同步更新文件的属性
  sync :只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写盘操作结束

  

五、fcntl函数 

  #include<fcntl.h>

  int fcntl(int fd,int cmd,int arg);    //返回值:若成功则依赖于cmd,若出错则返回-1

 

  fcntl函数有5种功能:1、复制一个现有的描述符 cmd=F_DUPFD

            2、获得/设置文件描述符标记 cmd=F_GETFD或F_SETFD

            3、获得/设置文件状态标志 cmd=F_GETFL或F_SETFL

            4、获得/设置异步I/O所有权 cmd=F_GETOWN或F_SETOWN

            5、获得/设置记录锁 cmd=F_GETLK、F_SETLK或F_SETLKW

转载于:https://www.cnblogs.com/mengfanxiao/p/4479745.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

死锁产生的原因及条件、如何避免死锁

一、死锁的定义 是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造、成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些永远在互相等待的进程称为死锁…

Git Proxy开关

2019独角兽企业重金招聘Python工程师标准>>> 这个是配合ShadowSocks使用的&#xff0c;在~/.bash_aliases或者~/.bash_profile中设置以下代码&#xff1a; #git proxy enable alias gitpe"git config --global http.proxy socks5://127.0.0.1:1080;git config …

SAP web 开发 (第二篇 bsp 开发 mvc模式 Part2 )

单击第一个图标&#xff0c;第一个图标突出显示&#xff0c;单击第二个图标&#xff0c;第一个变灰&#xff0c;第二个突出显示&#xff0c;反之一样。单击history读取历史记录。 Controller ZCL_SUS_C_ORDER_CHANGE 1. DO_INITmethod DO_INIT. *CALL METHOD SUPER->DO_I…

cuda内存总结

&#xff11;&#xff0e;shared memory __shared__ 声明为共享内存&#xff0c;将会保存在共享内存中 &#xff12;&#xff0e;constant memory __constant__ 声明为常量内存&#xff0c;将会保存在常量内存中&#xff0c;常量内存是只读内存&#xff0c;声明时要静态的分配…

平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡

AVL树的插入 在向一棵本来高度平衡的AVL树中插入一个新节点时&#xff0c;如果树中某个结点的平衡因子的绝对值 > 1&#xff0c;则出现了不平衡。设新插入结点为P&#xff0c;从结点P到根节点的路径上&#xff0c;每个结点为根的子树的高度都可能增加1&#xff0c;因此在每…

Fork/Join框架介绍

转http://www.infoq.com/cn/articles/fork-join-introduction/ 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架&#xff0c; 是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和…

为什么析构函数可以能声明为虚函数,构造函数不可以

转自&#xff1a;http://blog.csdn.NET/chen825919148/article/details/8020550 构造函数不能声明为虚函数&#xff0c;析构函数可以声明为虚函数&#xff0c;而且有时是必须声明为虚函数。 不建议在构造函数和析构函数里面调用虚函数。 构造函数不能声明为虚函数的原因是: 1 …

【DFS】NYOJ-325-zb的生日

【题目链接&#xff1a;NYOJ-325】 一道以我名字命名的题目&#xff0c;难道要我生日的时候再A&#xff1f; 思路&#xff1a;依旧深搜&#xff0c;但这个问题应该有一个专有名词吧&#xff0c;看别的博客说是 “容量为 sum/2 的背包问题”&#xff0c;不懂。。。 1 // abs() …

Ubuntu Sudo 无法解析的主机

如果对ubuntu在安装时候的主机名称不满意&#xff0c;可以使用如下的方法进行修改 需要注意的是如果只修改其中一个&#xff0c;使用sudo的时候会报“无法解析主机名称的”错误 1、进入etc目录&#xff0c;使用cat查看hosts文件 alloyubuntu:/etc$ cat hosts -n 1 127.0.0.1 …

信号集操作函数,信号未决、阻塞、递达

转载&#xff1a;信号集操作函数&#xff0c;信号阻塞与未决 一&#xff0c;信号集及相关操作函数 信号集被定义为一种数据类型&#xff1a; typedef struct { unsigned long sig[_NSIG_WORDS]&#xff1b; } sigset_t 信号集用来描述信号的集合&#xff0c;每个信号占用一位&a…

管道(Pipe)/createPipe

BOOL CreatePipe(PHANDLE hReadPipe, // 指向读句柄的指针 PHANDLE hWritePipe, // 指向写句柄的指针 LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性的指针 DWORD nSize // 管道大小); 管道&#xff08;Pipe&#xff09;实际是用于进程间通信的一段共享内存&…

linux输出文字的颜色特效

有关文字颜色及背景色可以参考&#xff1a;man console_codes-e 用来开启echo中的转义\e 或 \033 来输出Esc符号设置颜色的格式&#xff1a; \e[背景色;前景色;高亮m \033[背景色;前景色;高亮m恢复默认为 \e[0m其中背景色可以被以下数字替换第一个参数&#xff1…

互斥锁和自旋锁分别适用于什么样的业务场景

在多线程并发环境中&#xff0c;当某段代码被多个线程并发执行会导致数据不一致的情况出现时&#xff0c;我们就需要对这段代码加锁以保证线程安全了&#xff0c;我们可以对它施加互斥锁或者自旋锁&#xff0c;具体根据这段代码的执行耗时来定。 互斥锁的特点是&#xff1a;一把…

线程安全和可重入函数的联系与区别

1、 线程安全&#xff1a; 线程安全是多线程访问时&#xff0c;采用了加锁机制&#xff0c;当一个线程访问该类的某个数据时&#xff0c;进行保护&#xff0c;其他线程不能进行访问直到该线程访问完&#xff0c;其他线程才可以使用。不会出现数据不一致或数据污染。 线程不…

C++11 多线程 基础

C11开始支持多线程编程&#xff0c;之前多线程编程都需要系统的支持&#xff0c;在不同的系统下创建线程需要不同的API如pthread_create()&#xff0c;Createthread()&#xff0c;beginthread()等&#xff0c;使用起来都比较复杂&#xff0c;C11提供了新头文件<thread>、…

LB负载均衡集群--LVS

LB集群&#xff1a;LB集群是load balance 集群的简写&#xff0c;翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、keepalived &#xff0c;商业的硬件负载设备F5、Netscale。LB集群架构&#xff1a;当用户的请求过来时&#xff0c;会直接发到分发器&#xf…

linux 信号处理函数详解

转自&#xff1a;http://blog.csdn.NET/sddzycnqjn/article/details/7285760 1. 信号概念 信号是进程在运行过程中&#xff0c;由自身产生或由进程外部发过来的消息&#xff08;事件&#xff09;。信号是硬件中断的软件模拟(软中断)。每个信号用一个整型常量宏表示&#xff0…

2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索

邱老师降临小行星 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61Description 人赢邱老师和任何男生比&#xff0c;都是不虚的。有一天&#xff0c;邱老师带妹子(们)来到了一个N行M列平面的小行星。对于每一个着陆地点&#xf…

优化表的数据类型

我们可以使用PROCEDURE ANALYSE()对当前已有应用的表类型的判断&#xff0c;该函数可以对数据表中的列的数据类型提出优化建议&#xff0c;可以根据应用的实际情况酌情考虑是否实施优化。语法&#xff1a; SELECT * FROM tbl_name PROCEDURE ANALYSE(); SELECT * FROM tb…

Linux 信号之mysleep

一、 用alarm和pause实现sleep(3)函数,称为mysleep。 1. main函数调用mysleep函数,后者调用sigaction注册了SIGALRM信号的处理函数sig_alrm。 2. 调用alarm(seconds)设定闹钟。 3. 调用pause等待,内核切换到别的进程运行。 4. seconds秒之后,闹钟超时,内核发SIGALRM给这个…