對於乙個給定的描述符,有兩種為其指定非阻塞i/o的方法。
1. 如果呼叫open()函式獲得描述符,可以使用o_nonblock標誌。如int fd = open("a.txt", o_rdwr | o_noneblock);
2. 對於已經開啟的描述符,可以使用fcntl()函式設定o_nonblock標誌。
在此使用之前的例子:假設程序或執行緒a對乙個檔案寫入3000個字元「a」,而另乙個程序或執行緒b對這個檔案寫入3000個「b」,第三個程序或執行緒c讀取這個檔案,會導致讀取資料不一定是什麼。
檔案鎖解決的是多程序或多執行緒同時操作檔案產生資料衝突的問題。同一程序內部使用檔案鎖沒有效果。
設定檔案鎖使用fcntl()函式。所使用的檔案鎖結構體為struct flock,其定義如下:
struct示意圖如下:flock
檔案鎖允許多個程序同時讀,但不允許同時寫。因此檔案鎖分為讀鎖和寫鎖。讀鎖針對讀操作,允許其他程序讀檔案,但不允許寫;寫鎖針對寫操作,是不允許其他程序讀和寫。
檔案鎖一般用於多程序或多執行緒**中。
通過fcntl()的引數解釋,可知鎖定的方式有阻塞等待鎖定和立即鎖定(f_setlk)。阻塞等待鎖定如果鎖不上就會一直阻塞等待,直到其它程序釋放鎖後繼續上鎖。立即鎖定如果鎖不上就會立即返回-1。
檔案鎖示例**如下:
1 #include 2 #include 3 #include 4 #include 5對於兩函式,讀者可檢視四、poll()、select()和epoll()中第一節到第四節。6int
main()726
27close(fd);
28 }
本節在第七章:程序環境的六、儲存空間分配有詳細陳述。
下一章 第十五章:程序間通訊
讀書筆記 APUE 第十四章 高階IO
對於乙個給定的檔案描述符,有兩種方法對其指定非阻塞io 記錄鎖的功能是 當乙個程序讀或者修改某一檔案某個部分時,可以阻止其他程序修改同一檔案區。fcntl函式的第三個引數是乙個指向flock結構體的指標,通過它可以指定鎖的型別。先構造一張有關描述符的列表,然後呼叫乙個函式,直到這些描述符中的乙個已準...
第十四章約束
約束 constraint 是一種保證資料完整性的規則。約束設定在單個字段或者多個字段組合上,寫入這些欄位的行資料必須要符合約束的規則 約束的五種型別 not null 非空約束,指定某列的所有行資料不能包含空值 unique 唯一性約束,指定列或者列的組合的所有行資料必須唯一 primary ke...
第十四章 約束
第十四章 約束 練習1 1.學校有乙個選課系統,其中包括如下關係模式 系 系編號 主鍵,系名稱 唯一鍵,系主任 非空約束,系所在校去 取值範圍只能在南湖校區和渾南校區 create table xi xi no varchar2 10 primary key,xi name varchar2 10 ...