/*
 达内学习 UC day06 2013-10-10
*/

回忆过去:
 系统调用 - UNIX操作系统提供的一些列函数皆苦,用于访问内核空间,遵循posix规范
 文件操作:open()\read()\write()\close() 函数的使用

lseek() - 移动文件内指针,设置偏移量
dup()/dup2() - 文件描述符的复制
fcntl() - 文件控制函数,提供很多功能 文件相关函数

lseek() 用法和fseek() 基本一致,第一个参数是文件描述符,第二个参数是偏移量,第三个参数是偏移的参照位置,包括SEEK_SET(头)SEEK_CUR(当前) SEEK_END(文件结尾)

dup()和dup2()都可以复制文件描述符,但是不会复制文件表
dup() 复制描述符时候,新的描述符由系统选定
dup2()复制时,描述符由程序传入,如果改值被占用,关闭后使用传入的值

int fcntl(int fd,int cmd,...)
 通过不同的cmd 执行不同的操作,常见的cmd
 1 F_DUPFD 复制文件描述符 需要第三个参数传入新描述符的值,但返回描述符的值大于等于传入的值的最小值(不像dup2强制关闭)
 2 F_GETF 取文件的权限和状态,取不到创建标记,不需要第三个参数
 3 F_SETFL 设置文件的状态标记,支队O_APPEND 有效
 4 文件锁的操作和使用。

当多个进程同时访问同一个文件时,有可能引发数据访问错误,因此为了保证数据有效,需要用文件锁 控制多个进程对同一个文件读写操作p。
 文件锁:在一个进程操作文件时,锁定其他进程对文件的操作,直到结束对文件的操作。
 目前文件锁都采用读写锁,分为读锁和写锁
读锁:共享锁,允许多个进程对文件的某个区域加读锁
写锁:互斥锁,排他锁,只能有一个进程加锁。
加了读锁的区域,不能再加写锁
结论:如果一个进程对文件的某个区域加了读锁,其它进程可以对该区域加读锁,但不能加写锁,如果一个进程对文件的某个区域加了写锁,其他进程对该区域不能加任何锁

文件锁锁定文件的某部分
fcntl()对文件加锁解锁 int fcntl(int fd, int cmd, ... /* arg */ );
cmd可以是
F_SETLK  加锁/解锁 如果加不上锁,返回-1  F_SETLK (struct flock *)
F_SETLKW 加锁/解锁,如果加不上锁 等待  出错返回-1
F_GETLK  测试某个锁能某加上,但不真正加锁
文件锁用  struct flock 代表
struct flock
{
 short l_type; //锁的类型 F_RDLCK F_WRLCK,F_UNLCK
 short l_whence;//锁的起始点参照
 int l_start; //锁的起始点的偏移量
 int l_len; //锁的长度
 pid_t l_pid;F_GETLK专用,SET时不用,-1即可
}
锁定起始点  由l_where 和 l_start联合决定
注:1 加读锁/写锁fd要有对应权限
 2 进程结束会释放锁,但程序员应该读写完毕就主动释放锁,fcnl(fd,F_SETLK,&lock)其中lock的l_type设置为F_UNLCK即可

文件锁起始不是对read()/write()等读写函数的锁定,而是阻止其他进程对文件的莫个区域进行加锁,文件锁正确的使用方法是:
 在调用read()之前加读锁,调用write()之前加写锁

F_GETLK测试一个锁能否被加上,如果能加上,会把锁的类型改成G_UNLCK,其他不变,不能加会把锁的成员改成当前正在锁定的那个锁(不能锁的原因),并且把l_pid改成加锁的进程,一般用pid是否等于-1判断是否能加锁。

C语言描述时间的方式
time_t -秒差(和1970年1月1日0点0分0秒的秒差)
struct tm - 结构体 成员包括 年,月,日,小时,分,秒

内存地址表示变量在内存中的位置,i节点表示文件/目录在硬盘中的位置
文件表中存储的数据:1 文件偏移量;2 文件描述符的状态(内存中);3 文件自身的属性(硬盘中文件信息)

17,UC(06)的更多相关文章

  1. jjava Date格式是 May 07 17:44:06 CST 2018,怎么插入数据库中的timestamp格式中

    首先 我来记录下错误 死在时间格式转换错误手里了 大致就是时间格式转化失败 java代码中的May 07 17:44:06 CST 2018  是这个格式转换为 数据库的 yyyy-MM-dd HH: ...

  2. 2017年5月11日17:43:06 rabbitmq 消费者队列

    从昨天开始发现个问题,一个接口在本地调用时大部分正常,一旦在生成者打一个断点调试,并且在promotion也打断点的时候会出现没有返回channel的异常,然后消费者就再也消费不了了 16:57:45 ...

  3. cdh中hdfs非ha环境迁移Namenode与secondaryNamenode,从uc机器到阿里;

    1.停掉外部接入服务: 2 NameNode Metadata备份: 2.1 备份fsimage数据,(该操作适用HA和非HA的NameNode),使用如下命令进行备份: [root@cdh01 df ...

  4. 转--python 编码规范

    编程规范 1.1. 命名规范 1.1.1. [强制] 命名不能以下划线或美元符号开始和结尾 反例: name / __name / $Object / name / name$ / Object$ 1 ...

  5. hadoop 2.7.3本地环境运行官方wordcount

    hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...

  6. android 事件分发机制详解(OnTouchListener,OnClick)

    昨天做东西做到触摸事件冲突,以前也经常碰到事件冲突,想到要研究一下Android的事件冲突机制,于是从昨天开始到今天整整一天时间都要了解这方面的知识,这才懂了安卓的触摸和点击事件的机制.探究如下: 首 ...

  7. sql server 取文件名函数 转载

    /****** Object: UserDefinedFunction [dbo].[GetDirectoryPath] Script Date: 2016-12-16 16:54:05 ****** ...

  8. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)

    <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...

  9. 跨域之jsonp

    我们都知道使用<script>标签可以引入外部的JS文件,即使这个JS文件来自于其他的网站,比如我们引用存放在网络服务器上的jQuery框架.在这个过程中,我们已经实现跨域访问.像< ...

随机推荐

  1. C语言 · 求圆面积表面积体积

    算法提高 3-3求圆面积表面积体积   时间限制:1.0s   内存限制:256.0MB      问题描述 接受用户输⼊的数值,输出以该值为半径的(1)圆面积,(2)球体表面积,(3)球体体积.pi ...

  2. 数据库——IN、ANY、SOME 和 ALL 操作符的使用

    sql中all,any,some用法 简介: --All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id select * from #A where 5>All(select ...

  3. ansible register when: result | succeeded when: item.rc != 0

    ansible register 这个功能非常有用.当我们需要判断对执行了某个操作或者某个命令后,如何做相应的响应处理(执行其他 ansible 语句),则一般会用到register . 举个例子: ...

  4. JSON教程

    一.什么是JSON 1.JSON指的是JavaScript对象表示法(JavaScript Object Notation). 2.JSON是轻量级的文本数据交换格式,比XML更小.更快.更易解析. ...

  5. CSS圆角框,圆角提示框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. jquery easy ui 简单字段选择搜索实现

    code <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title& ...

  7. Web下的整体测试 --性能测试及优化思路

    随着Internet的日益普及,现在基于B/S结构的大型应用越来越多,可如何对这些应用进行测试成为日益迫切的问题.有许多测试人员来信问我B/S的测试如何做,由于工作较繁忙,对大家提出的问题也是头痛医头 ...

  8. matplotlib中的legend()——用于显示图例

    legend()的一个用法: 当我们有多个 axes时,我们如何把它们的图例放在一起呢?? 我们可以这么做: import matplotlib.pyplot as plt import numpy ...

  9. CentOS查看你是否有USB 3.0端口

    近来的大多数的新计算机都有了USB 3.0接口了.但是你怎么知道你的计算机有没有USB 3.0接口?这篇短文中,我们会告诉如何在Linux下知道你的系统上有USB 3还是USB3接口. 在Linux终 ...

  10. 【Java NIO的深入研究5】字符集Charset

    Java 语言被定义为基于Unicode.一个字符实体由二个字节表示(如果是用UCS-2).但众多文件和数据流都是基于其它字符编码并以byte传输,操作文件内容就成了一个问题. 操作一个文件首先要对文 ...