???? 在前面學習了文件IO,標準IO和終端IO,現在學習高級IO,UNIX中怎么有這么多的IO。
redis筆記????? 可以將系統調用分為兩類:低速系統調用和其他。低速系統調用是可能會使進程永遠阻塞的一類系統調用。非阻塞IO可以使用不會永遠阻塞的IO操作,如果這種操作不能完成,則立即出錯返回,表示該操作如果繼續執行,將繼續阻塞下去。
???? 對于一個給定的文件描述符,有兩種方法對其指定非阻塞的IO:
(1)如果是調用open以獲得該描述符,則可指定O_NONBLOCK標志
(2)對于已經打開的一個描述符,則可以調用fcntl打開O_NONBLOCK文件狀態標志
下面的函數演示了如何打開一個描述符的文件狀態標志以及如何關閉一個文件描述符的文件狀態標志:
void set_fl(int fd,int flags)
{int val;if( (val=fcntl(fd,F_GETFL,0))<0 ){printf("fcntl F_GETFL error\n");exit(0);}val |= flags;if( (fcntl(fd,F_SETFL,val))<0 ){printf("fcntl F_SETFL error\n");exit(0);}
}void clr_fl(int fd,int flags)
{int val;if( (val=fcntl(fd,F_GETFL,0))<0 ){printf("fcntl F_GETFL error\n");exit(0);}val &= ~flags;if( (fcntl(fd,F_SETFL,val))<0 ){printf("fcntl F_SETFL error\n");exit(0);}
}
java高手筆記、
???? 記錄在UNIX中是一個誤用的概念,因為在UNIX中根本沒有“文件記錄”這種概念,記錄鎖的一種個準確的說法是區域鎖。這個鎖既可以鎖一個字節,也可以鎖住整個文件。我們使用fcntl函數來操作記錄鎖,fcntl的函數原型如下:
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>int fcntl(int filedes,int cmd,.../*struct flock* flockptr*/);
前端筆記,
第一個參數是文件描述符,第二個參數有三種選擇如下:
(1)F_GETLK 決定由flockptr描述的鎖是否被另外一把鎖所排斥。如果有另外一把鎖,它阻止創建由flockptr所描述的鎖,則把這把鎖寫入到由flockptr所指向的結構體中。如果不存在這種情況,則除了把flockptr所指的結構體中的成員l_type設置為F_UNLCK之外,flockptr所指的結構體中的其他內容保持不變
(2)F_SETLK 設置由flockptr所指向的鎖,如果設置失敗,則立即出錯返回
(3)F_SETLKW 這是F_SETLK的阻塞版本,如果不能建立鎖,則會發生阻塞,W代表wait的意思
讀書筆記300字,
第三個參數是一個結構體,如下:
struct flock {...short l_type; /* Type of lock: F_RDLCK,F_WRLCK, F_UNLCK */short l_whence; /* How to interpret l_start:SEEK_SET, SEEK_CUR, SEEK_END */off_t l_start; /* Starting offset for lock */off_t l_len; /* Number of bytes to lock */pid_t l_pid; /* PID of process blocking our lock(F_GETLK only) */...};
(1)F_RDLCK 表示這是一把讀鎖
(2)F_WRLCK 表示這是一把寫鎖
(3)F_UNLCK 解鎖
???? 關于加鎖的過則如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 讀鎖 ? ? ? ? ? ? ? ? ? 寫鎖無鎖? ? ? ? ? ? ? ?可以 ? ? ? ? ? ? ? ? ? 可以一把或多把讀鎖 ? ? ? ? ? 可以 ? ? ? ? ? ? ? ? ? 拒絕一把寫鎖 ? ?? ? ? ? ? ?拒絕 ? ? ? ? ? ? ? ? ? 拒絕 ? ? ? ? ? ? ? ? ?
???? (1)當一個進程結束時,這個進程鎖加的鎖全部釋放
???? (2)當一個描述符關閉時,則通過這個描述符鎖建立的鎖釋放
???? (3)當關閉一個描述符時,則通過該描述符可以訪問的到的任何一把鎖都會被釋放,這就是說,下面兩種情況:
fd1 = open(pathname,...);
read_lock(fd1,...);
fd2 = dup(fd1);
close(fd2);
以及
fd1 = open(pathname,...);
read_lock(fd1,...);
fd2 = open(pathname,...);
close(fd2);
都會將由fd1所建立的鎖釋放。
???? (4)有fork產生的子進程并不繼承父進程的鎖建立的鎖;
???? (5)在執行exec后,新程序可以繼承原程序的鎖
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态