redis筆記,高級IO(一)--UNIX環境高級編程讀書筆記

 2023-11-19 阅读 26 评论 0

摘要:???? 在前面學習了文件IO,標準IO和終端IO,現在學習高級IO,UNIX中怎么有這么多的IO。 1.非阻塞IO redis筆記????? 可以將系統調用分為兩類:低速系統調用和其他。低速系統調用是可能會使進程永遠阻塞的一類系統調用。非阻塞IO可以使用不會永遠阻塞

???? 在前面學習了文件IO,標準IO和終端IO,現在學習高級IO,UNIX中怎么有這么多的IO。

1.非阻塞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);}
}

2.記錄鎖

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) */...};

l_type表示的是鎖的類型,它有3種選擇:
(1)F_RDLCK 表示這是一把讀鎖
(2)F_WRLCK 表示這是一把寫鎖
(3)F_UNLCK 解鎖

l_whence和l_start共同決定了鎖的起始位置,l_whence可以為SEEK_SET,SEEK_CUR,SEEK_END,l_start表示相對與l_whence的偏移量。l_len表示加鎖區域的長度,如果l_len為0,則表示從指定位置一直加鎖到文件結尾。l_pid表示加鎖的進程pid。

???? 關于加鎖的過則如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 讀鎖 ? ? ? ? ? ? ? ? ? 寫鎖無鎖? ? ? ? ? ? ? ?可以 ? ? ? ? ? ? ? ? ? 可以一把或多把讀鎖 ? ? ? ? ? 可以 ? ? ? ? ? ? ? ? ? 拒絕一把寫鎖 ? ?? ? ? ? ? ?拒絕 ? ? ? ? ? ? ? ? ? 拒絕 ? ? ? ? ? ? ? ? ?

3.鎖的隱含繼承和釋放

???? (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后,新程序可以繼承原程序的鎖

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/183705.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息