㈠ 关于vf中foxpro的各项命令,希帮忙填写说明和举例
ADATABASES() 将所有打开数据库的名称和路径放到内存变量数组中
ADBOBJECTS() 把当前数据库中的命名连接名、关系名、表名或sQL视图名放到一个内存变量数组中
AFIELDS() 把当前表的结构信息存放在一个数组中,并且返回表的字段数
ALIAS() 返回当前表或指定工作区衰的别名
ASESSIONS() 创建一个已存在的数据工作期ID数组
ATAGINFO() 创建一个包含索引和键表达式的名字、数量和类型信息的数组
AUSED() 将一个数据工作期中的表别名和工作区存入内存变量数组
BOF() 确定当前记录指针是否在表头
CANDIDATE() 判断索引是否为候选索引
CDX() 根据指定的索引位置编号,返回打开的复合索引(.CDX)文件名称
CPDBP() 返回一个打开表所使用的代码页
CREATEOFFLINE() 由已存在的视图创建一个游离视图
CURSORGETPROP() 返回VisualFoxPro表或临时表的当前属性设置
CURSORSETPROP() 指定VisualFoxPro表或临时表的属性设置
CURSORTOXML() 转换VisualFoxPro临时表为XML文本
CURVAL() 从磁盘上的表或远程数据源中直接返回字段值
DBC() 返回当前数据库的名称和路径
DBF() 返回指定工作区中打开的表名,或根据表别名返回表名
DBSETPROP() 给当前数据库或当前数据库中的字段、命名连接、表或视图设置一个属性
DELETED() 返回一个表明当前记录是否标有删除标记的逻辑值
DESCENDING() 是否用DESCENDING关键字创建了一个索引标识
DROPOFFLINE() 放弃对游离视图的所有修改,并把游离视图放回到数据库中
EOF() 确定记录指针位置是否超出当前表或指定表中的最后一个记录
FCOUNT() 返回衰中的字段数目
FIELD() 根据编号返回表中的字段名
FILTER() 返回SETFILTER命令中指定的表筛选表达式
FLDLIST() 对于SETmELDS命令指定的字段列表,返回其中的字段和计算结果字段表达式
FLOCK() 尝试锁定当前表或指定表
FOR() 返回一个己打开的单项索引文件或索引标识的索引筛选表达式
FOUND() 如果CONTINUE、FIND、LOCATE或SEEK命令执行成功,函数的返回值为"真"
FSIZE() 以字节为单位,返回指定字段或文件的大小
GETFLDSTATE() 返回一个数值,标明表或临时表中的字段是否已被编辑,或是否有追加的记录,或者记录的删除状态是否已更改
GETNEXTMODIFIED() 返回一个记录号,对应于缓冲表或临时表中下一个被修改的记录
HEADER() 返回当前或指定表文件的表头所占的字节数
IDXCOLLATE() 返回索引或索引标识的排序序列
INDBC() 如果指定的数据库对象在当前数据库中,则返回"真"(.T.)
INDEXSEEK() 在一个索引表中搜索第一次出现的某个记录
ISEXCLUSIVE() 判断一个表或数据库是以独占方式打开的
ISFLOCKED() 返回表的锁定状态
ISREADONLY() 判断是否以只读方式打开表
ISRLOCKED() 返回记录的锁定状态
KEY() 返回索引标识或索引文件的索引关键字表达式
KEYMATCH() 在索引标识或索引文件中搜索一个索引关键字
LOOKUP() 在表中搜索字段值与指定表达式匹配的第一个记录
LUPDATE() 返回一个表最近一次更新的日期
MDX() 根据指定的索引编号返回打开的.CDX复合索引文件名
MEMLINES() 返回备注字段中的行数
MLINE() 以字符串形式返回备注字段中的指定行
NDX() 返回为当前表或指定表打开的某一索引(JDX)文件的名称
ORDER() 返回当前表或指定表的主控索引文件或标识
PRIMARY() 检查索引标识,如果为主索引标识,就返回"真"(.T.)
RECCOUNT() 返回当前或指定表中的记录数目
RECNO() 返回当前表或指定表中的当前记录号
RECSIZE() 返回表中记录的大小(宽度)
REFRESH() 在可更新的SQL视图中刷新数据
RELATION() 返回为给定工作区中打开的表所指定的关系表达式
SEEK() 在一个已建立索引的表中搜索一个记录的第一次出现位置
SELECT() 返回当前工作区编号或未使用工作区的最大编号
SETFLDSTATE() 为表或临时表中的字段或记录指定字段状态值或删除状态值
SQLCANCEL() 请求取消一条正在执行的SQL语句
SQLCOLUMNS() 把指定数据源表的列名和关于每列的信息存储到一个VisualFoxPro临时表中
SQLCOMMIT() 提交一个事务
SQLCONNECT() 建立一个指向数据源的连接
SQLDISCONNECT() 终止与数据源的连接
SQLEXEC() 将一条SQL语句送入数据源中处理
SQLGETPROP() 返回一个活动连接的当前设置或默认设置
SQLMORERESULTS() 如果存在多个结果集合,则将另一个结果集合复制到VisualFoxPro临时表中
SQLPREPARE() 在使用SQLEXEC()执行远程数据操作前,可使用本函数使远程数据为将要执行的命令做好准备
SQLROLLBACK() 取消当前事务处理期间所做的任何更改
SQLSETPROP() 指定一个活动连接的设置
SQLSTRINGCONNECT() 使用一个连接字符串建立和数据源的连接
SQLTABLES() 把数据源中的表名存储到VisualFoxPro临时表中
SYS(14) 索引表达式
SYS(21) 控制索引编号
SYS(22) 控制标识名或索引名
SYS(2011) 返回当前工作区中记录锁定或表锁定的状态
SYS(2012) 返回表的备注字段块大小
SYS(2021) 筛选索引表达式
SYS(2029) 返回与表类型对应的值
SYS(3054) Rushmore优化等级 ·
TAG() 返回打开的.CDX多项复合索引文件的标识名,或者返回打开的.IDX单项索引文件的文件名
TAGCOUNT() 返回复合索引文件(.CDX)标识以及打开的单项索引文件(.IDX)的数目
TAGNO() 返回复合索引文件(.CDX)标识以及打开的单项索引(.IDX)文件的索引位置
TARGET() 返回一个表的别名,该表是SETRELATION命令的INTO子句所指定关系的目标
UNIQUE() 用于测试索引是否以惟一性方式建立
UPDATED() 用于测试在最近的READ命令中,数据是否已被修改
USED() 确定是否在指定工作区中打开了一个表
XMLTOCURSOR() 转换XML文本到VisualFoxPro游标或表
----------------------------------------------
Visual FoxPro日期和时间函数
CTOD()把字符表达式转换成日期表达式。
CDOW()从给定日期或日期时间表达式中返回星期值。
CMONTH()返回给定日期或日期时间表达式的月份名称。
CTOD()把字符表达式转换成日期表达式。
CTOT()从字符表达式返回一个日期时间值。
DATE()返回由操作系统控件的当前系统日期,或创建一个与2000年兼容的日期值。
DATETIME()以日期时间值返回当前的日期和时间, 或创建一个 2000 兼容的日期时间值。
DAY()以数值型返回给定日期表达式或日期时间表达式是某月中的第几天。
DMY()从一个日期型或日期时间型表达式返回一个“日-月-年”格式的字符表达式(例如,31 May 1995)。月名不缩写。
DTOC()由日期或日期时间表达式返回字符型日期。
DTOS()从指定日期或日期时间表达式中返回 yyyymmdd 格式的字符串日期。
DTOT()从日期型表达式返回日期时间型值。
GOMONTH()对于给定的日期表达式或日期时间表达式,返回指定月份数目以前或以后的日期。
HOUR()返回日期时间表达式的小时部分。
MDY()以“月-日-年”格式返回指定日期或日期时间表达式,其中月份名不缩写。
MINUTE()返回日期时间型表达式中的分钟部分。
MONTH()返回给定日期或日期时间表达式的月份值。
QUARTER()返回一个日期或日期时间表达式中的季度值。
SEC()返回日期时间型表达式中的秒钟部分。
SECONDS()以秒为单位返回自午夜以来经过的时间。
SYS(1)以日期数字字符串的形式返回当前系统日期。
SYS(2)返回自午夜零点开始以来的时间,按秒计算。
SYS(10)将 (Julian) 日期转换成一个字符串。
SYS(11)将日期格式表示的日期表达式或字符串转换成 (Julian) 日期。
TIME()以 24 小时制、8 位字符串(时:分:秒)格式返回当前系统时间。
TTOC()从日期时间表达式中返回一个字符值。
TTOD()从日期时间表达式中返回一个日期值。
WEEK()从日期表达式或日期时间表达式中返回代表一年中第几周的数值。
YEAR()从指定的日期表达式中返回年份。
Visual FoxPro字符函数
ALLTRIM(). 删除指定字符表达式的前后空格符
ASC() 返回字符表达式中最左边字符的ANSI值
AT() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
AT_C() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
ATC() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
ATCC() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
ADDBS() 如果必要,向一个路径表达式添加一个反斜杠
ATCLINE() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中第一次出现的行号
ATLINE() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的行号
BETWEEN() 判断一个表达式的值是否在另外两个相同数据类型的表达式的值之间
CHR() 根据指定的ANSI数值代码返回其对应的字符
CHRTRAN() 将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第3个表达式中相应的字符
CHRTRANC() 将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第3个表达式中相应的字符
CPCONVERT() 把字符、备注字段或字符表达式转换到其他代码页
CHRSAW() 确定一个字符是否出现在键盘缓冲区中
CHRTRAN() 在一个字符表达式中,把与第二个表达式字符相匹配的字符替换为第三个表达式中相应字符
CHRTRANC() 将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第三个表达式中相应的字符
DIFFERENCE() 返回0到4间的一个整数,表示两个字符表达式间的相对语音差别
EMPTY() 确定表达式是否为空值
GErWORDCOUNr() 计数一个中中的单词数
GETWORDNUM() 从一个串中返回一个指定的词
INLIST() 判断一个表达式是否与一组表达式中的某一个相匹配 '
ISALPHA() 判断字符表达式的最左边一个字符是否为字母
ISBLANK() 判断表达式是否为空值
ISDIGIT() 判断字符表达式的最左边一个字符是否为数字(0到9)
ISLEADBYTE() 如果字符表达式第一个字符的第一个字节是前导字节,则返回"真"(.T.)
ISLOWER() 判断字符表达式最左边的字符是否为小写字母
ISMOUSE() 判断计算机是否具有鼠标
ISNULL() 判断计算结果是否为NULL值
ISUPPER() 判断字符表达式的第一个字符是否为大写字母(A~z)
LEFT() · 从字符表达式最左边一个字符开始返回指定数目的字符
LEPTC() 从字符表达式最左边一个字符开始返回指定数目的字符
LEN() 返回字符表达式中字符的数目
LENC() 返回字符表达式中字待的数目
LIKE() 确定一个字符表达式是否与另一个字符表达式相匹配
LIKEC() 决定一个字符表达式是否与另一个字符表达式相匹配
LOWER() 以小写字母形式返回指定的字符表达式
LTRIM() 删除指定的字符表达式的前导空格,然后返回得到的表达式
OCCURS() 返回一个字符表达式在另一个字符表达式中出现的次数
OEMTOANSI() 用于将字符串表达式中的字符转换成与其相对应的ANSI字符集中的字符
PADL()、PADR()、PADC() 由一个表达式返回一个字符中,并从左边,右边或同时从两边用空格或字符把该字符串填充到 指定长度
PROPER() 从字符表达式中返回一个字符串,字符串中的每个首字母大写
RAT() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段内第一次出现的位置,从最右 边的字符算起
RATC() 返回一个字符表达式在另-个字符表达式或备注字段最后一次出现所在的行号,从最后-行算起
RATLINE() 回一个字符表达式或备注字段在另一个字符表达式或备注字段中最后出现的行号,从最后一行 开始计数 。
REPUCATE() 返回一个字符串,这个字符串是将指定字符表达式重复指定次数后得到的
RIGHT() 从一个字符串的最右边开始返回指定数目的字符
RIGHTC() 从一个字符串中返回最右边指定数目的字符
RTRIM() 删除了字符表达式后续空格后,返回结果字符串
SOUNDEX() 返回指定的字符表达式的语音表示
SPACE() 返回由指定数目的空格构成的字符串
STR() 返回与指定数值表达式对应的字符
STRCONV() 将字符表达式转换成另一种形式
STREXTRACT() 返回一个两个分隔符间的串
STRTRAN() 在第一个字符表达式或备注字段中,搜索第二个字符表达式或备注字段,并用第3个字符表达-式或备注字段替换每次出现的第2个字符表达式或备注字段
STUFF() 返回一个字符串,此字符串是通过用另一个字符表达式替换现有字符表达式中指定数目的字符得到的
STUFFC() 返回一个字符串,此字符串是通过用另一个字符表达式替换现有字符表达式中指定数目的字符、得到的
SUBSTR() 从给定的字符表达式或备注字段中返回字符串
SUBSTRC() 从给定的字符表达式或者备注字段返回字符串
SYS(15) 替换字符串中的字符
SYS(20) 转换德文文本
TEXTMERGE() 提供串表达式的求值 。
TRIM() 返回删除全部后缀空格后的指定字符表达式
TXTWIDTH() 按照字体平均字符宽度返回字符表达式的长度
TYPE() 计算字符表达式,并返回其内容的数据类型
UPPER() 用大写字母返回指定的字符表达式
----------------------------------------------
Visual FoxPro数值函数
ABS() 返回指定数值表达式的绝对值
ACOS() 返回指定数值表达式的反余弦值
ASIN() 返回数值表达式的反正弦弧度值
ATAN() 返回数值表达式的反正切弧度值
ATN2() 返回指定值的反正切值,返回值无象限限制
BINTOC() 将整型用二进制字符型表示 。
BITAND() 返回两个数值型数值在按位进行AND运算后的结果
BITCLEAR() 清除一个数值型数值的指定位(将此位设置成0),并返回结果值
BITLSHIFr() 返回一个数值型数值向左移动给定位后的结果
BrrNOT() 返回一个数值型数值按位进行NOT运算的结果
BITOR() 返回两个数值型数值按位进行OR运算的结果
BITRSHIFF() 返回一个数值型数值向右移动指定位后的结果
BITSET() 将一个数值型数值的某一位设置为1并返回结果
BITTEST() 确定一个数值型数值的指定位是否为1
BITXOR() 返回两个数值型数值按位进行异或运算的结果
CEILING() 返回大于或等于指定数值表达式的最小整数
COS() 返回数值表达式的余弦值
CTOmN() 将二进制字符型表示转换为整数
DTOR() 将度转换为弧度
EVALUATE() 计算字符表达式的值并返回结果
EVL() 从两个表达式中返回一个非空值
EXP() 返回eAx的值,其中x是某个给定的数值型表达式
FLOOR() 对于给定的数值型表达式值,返回小于或等于它的最大整数
FV() 返回一笔金融投资的未来值
INT() 计算一个数值表达式的值,并返回其整数部分
LOG() 返回给定数值表达式的自然对数(底数为c)
LOGl0() 返回给定数值表达式的常用对数(以10为底) ·
MAX() 对几个表达式求值,并返回具有最大值的表达式
MIN() 计算一组表达式,并返回具有最小值的表达式
MOD() 用一个数值表达式去除另一个数值表达式,返回余数
MTON() 由一个货币型表达式返回一个数值型值
NORMALIZE() 把用户提供的字符表达式转换为可以与VisualFoxPro函数返回值相比较的格式
NTOM() 由一个数值表达式返回含有四位小数的货币值
NVL() 从两个表达式返回一个非null值
PAYMENT() 返回固定利息贷款按期兑付的每一笔支出数量
PI() 返回数值常数n
PV() 返回某次投资的现值
RAND() 返回一个0到1之间的随机数
ROUND() 返回圆整到指定小数位数的数值表达式
RTOD() 将弧度转化为度
SIGN() 当指定数值表达式的值为正、负或0时,分别返回1、-1或0
SIN() 返回一个角度的正弦值 ·
SQRT() 返回指定数值表达式的平方根
SYS(2007) 返回一个字符表达式的检查求和值
TAN() 返回角度的正切值
VAL() 由数字组成的字符表达式返回数字值
㈡ iuni系统怎么把应用上锁
文件锁
1.fcntl()函数说明
前面讲述的5个基本函数实现了文件的打开、读/写等基本操作,本节将讨论在文件已经共享的情况下如何操作,也就是当多个用户共同使用、操作一个文件的情况。这时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。
文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作时,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
在Linux中,实现文件上锁的函数有lockf()和fcntl(),其中lockf()用于对文件施加建议性锁,而fcntl()不仅可以施加建议性锁,还可以施加强制性锁。同时,fcntl()还能对文件的某一记录上锁,也就是记录锁。
记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。
fcntl()函数具有很丰富的功能,它可以对已打开的文件描述符进行各种操作,不仅包括管理文件锁,还包括获得设置文件描述符和文件描述符标志、文件描述符的复制等很多功能。本节主要介绍fcntl()函数建立记录锁的方法,关于它的其他操作,感兴趣的读者可以参看fcntl手册。
2.fcntl()函数格式
用于建立记录锁的fcntl()函数语法要点如表2.6所示。
表2.6 fcntl()函数语法要点
所需头文件
#include
<sys/types.h>
#include <unistd.h>
#include <fcntl.h>
函数原型
int fcntl(int fd, int cmd, struct flock
*lock)
函数传入值
fd:文件描述符
cmd
F_DUPFD:复制文件描述符
F_GETFD:获得fd的close-on-exec标志,若标志未设置,则文件经过exec()函数之后仍保持打开状态
F_SETFD:设置close-on-exec标志,该标志由参数arg的FD_CLOEXEC位决定
F_GETFL:得到open设置的标志
F_SETFL:改变open设置的标志
F_GETLK:根据lock描述,决定是否上文件锁
F_SETLK:设置lock描述的文件锁
F_SETLKW:这是F_SETLK的阻塞版本(命令名中的W表示等待(wait))。
在无法获取锁时,会进入睡眠状态;如果可以获取锁或者捕捉到信号则会返回
lock:结构为flock,设置记录锁的具体状态,后面会详细说明
函数返回值
成功:0
1:出错
这里,lock的结构如下所示:
struct flock
{
short
l_type;
off_t l_start;
short l_whence;
off_t
l_len;
pid_t l_pid;
}
lock结构中每个变量的取值含义如表2.7所示。
表2.7 lock结构变量取值
l_type
F_RDLCK:读取锁(共享锁)
F_WRLCK:写入锁(排斥锁)
F_UNLCK:解锁
l_start
加锁区域在文件中的相对位移量(字节),与l_whence值一起决定加锁区域的起始位置
l_whence:
相对位移量的起点(同lseek的whence)
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小
l_len
加锁区域的长度
为加锁整个文件,通常的方法是将l_start设置为0,l_whence设置为SEEK_SET,l_len设置为0。
3.fcntl()使用实例
下面首先给出了使用fcntl()函数的文件记录锁功能的代码实现。在该代码中,首先给flock结构体的对应位赋予相应的值。
接着调用两次fcntl()函数。用F_GETLK命令判断是否可以进行flock结构所描述的锁操作:若可以进行,则flock结构的l_type会被设置为F_UNLCK,其他域不变;若不可进行,则l_pid被设置为拥有文件锁的进程号,其他域不变。
用F_SETLK和F_SETLKW命令设置flock结构所描述的锁操作,后者是前者的阻塞版。
当第一次调用fcntl()时,使用F_GETLK命令获得当前文件被上锁的情况,由此可以判断能不能进行上锁操作;当第二次调用fcntl()时,使用F_SETLKW命令对指定文件进行上锁/解锁操作。因为F_SETLKW命令是阻塞式操作,所以,当不能把上锁/解锁操作进行下去时,运行会被阻塞,直到能够进行操作为止。
文件记录锁的功能代码具体如下所示:
/* lock_set.c */
int lock_set(int
fd, int type)
{
struct flock old_lock,
lock;
lock.l_whence = SEEK_SET;
lock.l_start =
0;
lock.l_len = 0;
lock.l_type =
type;
lock.l_pid = -1;
/* 判断文件是否可以上锁
*/
fcntl(fd, F_GETLK, &lock);
if (lock.l_type !=
F_UNLCK)
{
/* 判断文件不能上锁的原因 */
if
(lock.l_type == F_RDLCK) /* 该文件已有读取锁
*/
{
printf("Read lock already set by %d\n",
lock.l_pid);
}
else if (lock.l_type == F_WRLCK) /*
该文件已有写入锁 */
{
printf("Write lock already set
by %d\n", lock.l_pid);
}
}
/* l_type
可能已被F_GETLK修改过 */
lock.l_type = type;
/*
根据不同的type值进行阻塞式上锁或解锁 */
if ((fcntl(fd, F_SETLKW, &lock)) <
0)
{
printf("Lock failed:type = %d\n",
lock.l_type);
return
1;
}
switch(lock.l_type)
{
case
F_RDLCK:
{
printf("Read lock set by %d\n",
getpid());
}
break;
case
F_WRLCK:
{
printf("Write lock set by %d\n",
getpid());
}
break;
case
F_UNLCK:
{
printf("Release lock by %d\n",
getpid());
return
1;
}
break;
default:
break;
}/*
end of switch */
return 0;
}
下面的实例是文件写入锁的测试用例,这里首先创建了一个hello文件,之后对其上写入锁,最后释放写入锁。代码如下所示:
/* write_lock.c */
#include
<unistd.h>
#include <sys/file.h>
#include
<sys/types.h>
#include <sys/stat.h>
#include
<stdio.h>
#include <stdlib.h>
#include
"lock_set.c"
int main(void)
{
int
fd;
/* 首先打开文件 */
fd = open("hello",O_RDWR | O_CREAT,
0644);
if(fd < 0)
{
printf("Open file
error\n");
exit(1);
}
/* 给文件上写入锁
*/
lock_set(fd, F_WRLCK);
getchar();
/* 给文件解锁
*/
lock_set(fd, F_UNLCK);
getchar();
close(fd);
exit(0);
}
为了能够使用多个终端,更好地显示写入锁的作用,本实例主要在PC上测试,读者可将其交叉编译,下载到目标板上运行。下面是在PC上的运行结果。为了使程序有较大的灵活性,笔者采用文件上锁后由用户输入任意键使程序继续运行。建议读者开启两个终端,并且在两个终端上同时运行该程序,以达到多个进程操作一个文件的效果。在这里,笔者首先运行终端一,请读者注意终端二中的第一句。
终端一:
$ ./write_lock
write lock set by
4994
release lock by 4994
终端二:
$ ./write_lock
write lock already
set by 4994
write lock set by 4997
release lock by 4997
由此可见,写入锁为互斥锁,同一时刻只能有一个写入锁存在。
接下来的程序是文件读取锁的测试用例,原理与上面的程序一样。
/* fcntl_read.c */
#include
<unistd.h>
#include <sys/file.h>
#include
<sys/types.h>
#include <sys/stat.h>
#include
<stdio.h>
#include <stdlib.h>
#include
"lock_set.c"
int main(void)
{
int fd;
fd
= open("hello",O_RDWR | O_CREAT, 0644);
if(fd <
0)
{
printf("Open file
error\n");
exit(1);
}
/* 给文件上读取锁
*/
lock_set(fd, F_RDLCK);
getchar();
/* 给文件解锁
*/
lock_set(fd, F_UNLCK);
getchar();
close(fd);
exit(0);
}
同样开启两个终端,并首先启动终端一上的程序,其运行结果如下所示。
终端一:
$ ./read_lock
read lock set by
5009
release lock by 5009
终端二:
$ ./read_lock
read lock set by
5010
release lock by 5010
读者可以将此结果与写入锁的运行结果相比较,可以看出,读取锁为共享锁,当进程5009已设置读取锁后,进程5010仍然可以设置读取锁。
㈢ php5教程之文件操作
一 引论
在任何计算机设备中 文件是都是必须的对象 而在web编程中 文件的操作一直是web程序员的头疼的地方 而 文件的操作在cms系统中这是必须的 非常有用的 我们经常遇到生成文件目录 文件(夹)编辑等操作 现在我把php中的这些函数做一详细总结并实例示范如何使用 关于对应的函数详细介绍 请查阅php手册 此处只总结重点 和需要注意的地方 (这在php手册是没有的 )( lian )
二 目录操作
首先介绍的是一个从目录读取的函数 opendir() readdir() closedir() 使用的时候是先打开文件句柄 而后迭代列出:
<?php $base_dir = filelist/ ; $fso = opendir($base_dir); echo $base_dir <hr/> ; while($flist=readdir($fso)){ echo $flist <br/> ; } closedir($fso) ?>
这是讲返回文件目录下面的文件已经目录的程序( 文件将返回false)
有时候需要知道目录的信息 可以使用dirname($path)和basename($path) 分别返回路径的目录部分和文件名名称部分 可用disk_free_space($path)返回看空间空余空间
创建命令:
mkdir($path )
是权限码 在非window下可用umask()函数设置
rmdir($path)
将删除路径在$path的文件
dir directory 类也是操作文件目录的重要类 有 个方法 read rewind close 这是一个仿面向对象的类 它先使用的是打开文件句柄 然后用指针的方式读取的 这里看php手册:
<?php$d = dir( /etc/php );echo Handle: $d >handle /n ;echo Path: $d >path /n ;while (false !== ($entry = $d >read())) { echo $entry /n ;}$d >close();?>
输出:
Handle: Resource id # Path: /etc/php apachecgicli
文件的属性也非常重要 文件属性包括创建时间 最后修改时间 所有者 文件组 类型 大小等
下面我们重点谈文件操作
三 文件操作
A 读文件
首先是一个文件看能不能读取(权限问题) 或者存在不 我们可以用is_readable函数获取信息
<?php$file = dirlist php ;if (is_readable($file) == false) { die( 文件不存在或者无法读取 );} else { echo 存在 ;}?>
判断文件存在的函数还有file_exists(下面演示) 但是这个显然无is_readable全面 当一个文件存在的话可以用
<?php$file = filelist php ;if (file_exists($file) == false) { die( 文件不存在 );}$data = file_get_contents($file);echo entities($data);?>
但是file_get_contents函数在较低版本上不支持 可以先创建文件的一个句柄 然后用指针读取全部:
$fso = fopen($cacheFile r ); $data = fread($fso filesize($cacheFile)); fclose($fso);
还有一种方式 可以读取二进制的文件:
$data = implode( file($file));
B 写文件
和读取文件的方式一样 先看看是不是能写:
<?php$file = dirlist php ;if (is_writable($file) == false) { die( 我是鸡毛 我不能 );}?>
能写了的话可以使用file_put_contents函数写入:
<?php $file = dirlist php ; if (is_writable($file) == false) { die( 我是鸡毛 我不能 ); } $data = 我是可鄙 我想要 ; file_put_contents ($file $data); ?>
file_put_contents函数在php 中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用 可以使用如下方式:
$f = fopen($file w ); fwrite($f $data); fclose($f);
替换之
写文件的时候有时候需要锁定 然后写:
function cache_page($pageurl $pagedata){ if(!$fso=fopen($pageurl w )){ $this >warns( 无法打开缓存文件 );//trigger_error return false; } if(!flock($fso LOCK_EX)){//LOCK_NB 排它型锁定 $this >warns( 无法锁定缓存文件 );//trigger_error return false; } if(!fwrite($fso $pagedata)){//写入字节流 serialize写入其他格式 $this >warns( 无法写入缓存文件 );//trigger_error return false; } flock($fso LOCK_UN);//释放锁定 fclose($fso); return true; }
C 复制 删除文件
php删除文件非常easy 用unlink函数简单操作:
<?php $file = dirlist php ; $result = @unlink ($file); if ($result == false) { echo 蚊子赶走了 ; } else { echo 无法赶走 ; } ?>
即可
复制文件也很容易:
<?php $file = yang txt ; $newfile = ji txt ; # 这个文件父文件夹必须能写 if (file_exists($file) == false) { die ( 小样没上线 无法复制 ); } $result = ($file $newfile); if ($result == false) { echo 复制记忆ok ; } ?>
可以使用rename()函数重命名一个文件夹 其他操作都是这几个函数组合一下就能实现的
D 获取文件属性
我说几个常见的函数:
获取最近修改时间:
<?php $file = test txt ; echo date( r filemtime($file)); ?>
返回的说unix的时间戳 这在缓存技术常用
相关的还有获取上次被访问的时间fileatime() filectime()当文件的权限 所有者 所有组或其它 inode 中的元数据被更新时间 fileowner()函数返回文件所有者
$owner = posix_getpwuid(fileowner($file));
(非window系统) ileperms()获取文件的权限
<?php$file = dirlist php ;$perms = substr(sprintf( %o fileperms($file)) );echo $perms;?>
filesize()返回文件大小的字节数:
<?php
// 输出类似 somefile txt: bytes
$filename = somefile txt ; echo $filename : filesize($filename) bytes ;
?>
获取文件的全部信息有个返回数组的函数stat()函数:
<?php $file = dirlist php ; $perms = stat($file); var_mp($perms); ?>
那个键对应什么可以查阅详细资料 此处不再展开
四 结束语
lishixin/Article/program/PHP/201311/21262