㈠ 關於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