Linux系統學習Day04 阻塞特性,文件狀態及文件夾查詢

知識點4【文件的阻塞特性】

文件描述符 默認為 阻塞?的

比如:我們讀取文件數據的時候,如果文件緩沖區沒有數據,就需要等待數據的到來,這就是阻塞

當然寫入的時候,如果發現緩沖區是滿的,也需要等待刷新緩沖區,才可寫入,這也是阻塞

注意:阻塞和非阻塞都是對文件而言的,并不是read和write的屬性

下面 我來介紹兩種設置文件非阻塞的方法:

  1. 通過open函數再打開文件的時候,設置文件為非阻塞

注意:文件描述符 事先不存在?才使用open的方法

案例1:open打開文件,默認為阻塞特性

這里補充一個知識點,當我們需要 打開終端時,終端的目錄是 /dev/tty,下面我們在Linux中查看一下

好了現在我們實現從終端中讀數據

代碼演示

  1. 帶有阻塞特性
int?main(int?argc, char?const?*argv[]){//打開文件int?fd?=?open("/dev/tty",O_RDONLY?|?O_NONBLOCK);if(fd?<?0){perror("open");return?0;}//讀取文件到數組printf("非阻塞特性展示\n");printf("請輸入字符數據\n");char?buf[128] =?"";read(fd,buf,sizeof(buf));printf("buf = %s\n",buf);//關閉文件close(fd);return?0;}

可以看到有一個等待的過程

  1. 非阻塞特性

僅展示主要代碼

int?fd?=?open("/dev/tty",O_RDONLY?|?O_NONBLOCK);

  1. 使用fcntl函數在文件打開后設置文件為非阻塞

文件描述符 事先存在?

fcntl函數介紹

int fcntl(int fd,int cmd,…/*arg*/)

功能介紹

改變已打開文件描述符的文件性質,針對文件描述符提供控制

參數

fd:文件描述符

cmd:操作方式

arg:cmd不同,arg會不同

返回值

成功:不同的cmd,會有不同

失敗:-1

cmd:

fcntl函數有5種功能:

1) 復制一個現有的描述符(cmd=F_DUPFD)

2) 獲得/設置文件描述符標記(cmd=F_GETFD或F_SETFD)

3) 獲得/設置文件狀態標記(cmd=F_GETFL或F_SETFL)

4) 獲得/設置異步I/O所有權(cmd=F_GETOWN或F_SETOWN)

5) 獲得/設置記錄鎖(cmd=F_GETLK, F_SETLK或F_SETLKW)

這里我們設置阻塞特性主要使用 cmd=F_GETFL或F_SETFL

但這里我提一下 文件狀態標記和文件描述符標記是不同的,大家可以自行使用ChatGPT搜索區別,若仍有疑問可以評論留言

設置一個存在的文件描述符的阻塞特性的步驟
  1. fcntl先得到的文件描述符的狀態標記
  2. 修改文件的狀態標記
  3. 將修改后的狀態標記應用到文件描述符上

代碼演示

#include?<stdio.h>#include?<sys/types.h>#include?<sys/stat.h>#include?<fcntl.h>#include?<unistd.h>int?main(int?argc, char?const?*argv[]){//提取文件狀態標記int?flag?=?fcntl(0,F_GETFL);//處理文件狀態標記flag?=?flag?|?O_NONBLOCK;//應用文件狀態標記fcntl(0,F_SETFL,flag);//阻塞特性驗證char?buf[128] =?"";printf("請輸入數據\n");read(0,buf,sizeof(buf));printf("buf = %s\n",buf);return?0;}
代碼運行結果

知識點5【獲取文件狀態】

int stat(const char *path,struct stat *buf);

int lstat(const char *path,struct stat *buf);

思想補充

我們能知道如果要想要函數內部修改函數外部的值,參數為指針類型

我們反過來也許知道

如果函數參數是指針類型,我們就需要知道這個函數需要是對其進行賦值操作的

stat和lstat的區別

概念復習

這里幫大家復習一個概念

鏈接方式分為軟鏈接和硬鏈接?

軟連接:類似于快捷方式,操作其鏈接文件數據,源文件數據也會改變,但是如果源文件被刪除,鏈接文件不能正常使用

軟鏈接:類似于快捷方式,操作其鏈接文件數據,源文件數據也會改變,但是如果源文件被刪除,鏈接文件不能正常使用

硬鏈接:類似于文件的拷貝(不是簡單的拷貝,有鏈接),操作其鏈接文件數據,源文件數據也會改變,但是如果源文件被刪除,鏈接文件能正常使用

區別

當我們查看鏈接文件的文件信息的時候

stat:會獲得源文件的文件信息

lstat:會獲得鏈接文件的文件信息

查看源文件的文件信息的時候,沒有區別,最好使用stat

這兩個函數的參數,返回值都一樣

函數介紹

參數

path:文件的路徑及文件名

buf:保存文件信息的結構體

返回值

成功:0

失敗:-1

案例1:獲取文件的屬性、大小

這里主要介紹兩種文件模式的判斷方式

  1. 使用宏,這里 的都是宏,我們只需要使用宏函數可以直接判斷

  1. 使用按位與的操作

if((s.st_mode & S_IRWXU)?== S_IRWXU)

注意:這里的()必須加,優先級問題

代碼演示

#include?<stdio.h>#include?<sys/types.h>#include?<sys/stat.h>#include?<unistd.h>int?main(int?argc, char?const?*argv[]){struct?stat?s;stat("./text.txt",&s);//方式一判斷文件類型if(S_ISDIR(s.st_mode)){printf("text是一個目錄\n");}//方式二判斷文件類型else?if((s.st_mode?&?S_IFREG) ==?S_IFREG){printf("text是一個普通文件\n");}//文件權限 有上面的man 2 stat 可知 判斷只能使用 方式二if((s.st_mode?&?S_IRUSR) ==?S_IRUSR){printf("text文件所有者可讀\n");}if((s.st_mode?&?S_IWUSR) ==?S_IWUSR){printf("text文件所有者可寫\n");}if((s.st_mode?&?S_IXUSR) ==?S_IXUSR){printf("text文件所有者可執行\n");}return?0;}
代碼運行結果

知識點6【文件目錄操作函數】(重點)

常用文件目錄操作函數:opendir readdir closedir ?下面詳細介紹

  1. 得到文件目錄的句柄 opendir

句柄

句柄就是結構體指針

句柄我們在文件操作中也用到過,比如我們得到的FILE*就是一個文件句柄。FILE * 是一個結構體指針,結構體中存儲的是文件信息

在文件目錄的介紹中,我們先函數介紹功能,然后通過一個整體的項目帶大家了解其功能

函數介紹

DIR *opendir(const char *name)

功能

打開一個目錄

參數

name:目錄名

返回值

成功:返回指向該目錄的 結構體的指針(目錄句柄)

失敗:NULL

  1. 讀取目錄readdir

函數介紹

struct dirent *readdir(DIR *dirp)

功能介紹

讀取目錄,調用一次只能讀取一個文件

參數

dirp:opendir的返回值

返回值

成功:目錄結構體指針

失敗:NULL

struct dirent 結構體介紹

d_type相關數據

  1. 關閉目錄closedir

函數介紹

int close(DIR *dirp)

功能介紹

讀取目錄,調用一次只能讀取一個文件

參數

dirp:opendir的返回值

返回值

成功:0

失敗:1

代碼演示

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
void readDir(char *name);
int main(int argc, char const *argv[])
{readDir("..");return 0;
}/*** 讀取一個目錄中的內容** @param const char *name  目錄名* @return 添加成功返回 1,否則返回 0*/
void readDir(char *name)
{//打開一個文件夾,并判斷打開文件是否有效DIR *dirp = opendir(name);//讀取文件夾 循環struct dirent *read_dir; while(read_dir = readdir(dirp)){if((read_dir->d_type & DT_REG) == DT_REG){printf("%s是一個普通文件\n",read_dir->d_name);}else if((read_dir->d_type & DT_DIR) == DT_DIR){//測試時 發現文件夾中有.. 和 . 文件夾,因此去掉if (strcmp(read_dir->d_name, ".") == 0 || strcmp(read_dir->d_name, "..") == 0) {continue; // 跳過本次循環}//處理遞歸目標目錄char dir_name[512] = "";sprintf(dir_name,"%s/%s",name,read_dir->d_name);//printf("dir_name = %s\n",dir_name);printf("\n%s是一個文件夾,它的內部文件為:\n",read_dir->d_name);readDir(dir_name);}}//關閉目錄closedir(dirp);
}

結束

代碼重在練習!

代碼重在練習!

代碼重在練習!

今天的分享就到此結束了,希望對你有所幫助,如果你喜歡我的分享,請點贊收藏夾關注,謝謝大家!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75945.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75945.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue 3 從零開始到掌握

vue3從零開始一篇文章帶你學習 升級vue CLI 使用命令 ## 查看vue/cli版本&#xff0c;確保vue/cli版本在4.5.0以上 vue --version ## 安裝或者升級你的vue/cli npm install -g vue/cli ## 創建 vue create vue_test ## 啟動 cd vue_test npm run servenvm管理node版本&#…

Mysql專題篇章

一、事務的四大特性&#xff1f; 1、原子性&#xff1a;是指事務包含的所有操作要么全部成功&#xff0c;要么全部失敗回滾。 2、一致性&#xff1a;是指一個事務執行之前和執行之后都必須處于一致性狀態。比如a與b賬戶共有100塊&#xff0c;兩人之間轉賬之后無論成功還是失敗…

CAD插件實現:自動遞增編號(前綴、后綴、位數等)——CADc#實現

cad中大量輸入一定格式的遞增編號時&#xff0c;可用插件實現&#xff0c;效果如下&#xff1a; ①本插件可指定數字位數、起始號碼、加前綴、后綴、文字顏色等&#xff08;字體樣式和文字所在圖層為cad當前圖層和當前字體樣式&#xff09;。 ②插件采用Jig方式&#xff0c;即…

k8s1.24升級1.28

0、簡介 這里只用3臺服務器來做一個簡單的集群&#xff0c;當前版本是1.24.17目標升級到1.28.17 地址主機名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 因為1.24已經更換過了容器運行時&#xff0c;所以之后的升級相對就會簡單&am…

4.3-2 jenkins

一.登錄jenkins 二.修改密碼 三.配置節點 新建節點 編輯節點名稱 編輯節點配置 激活節點 將jar下載到指定的路徑 再到dos命令下的路徑 E:\az\wx 執行 配置節點成功 四. 安全設置中&#xff0c;勾選代理 五.新建項目 編輯項目名稱 編輯項目執行的 路徑&#xff1a;C:\Users\Ad…

js對象與數組的互轉

js對象與數組的互轉 文章目錄 js對象與數組的互轉一、數組轉對象1.使用forEach,for in,es6展開運算符,assign2. 使用 Object.fromEntries()3. 將數組轉為鍵值對對象4. 使用 reduce()4. 數組元素為對象時提取屬性 二、對象轉數組1. 提取鍵/值/鍵值對2. 轉換為特定結構的數組 三、…

HTTPS在信息傳輸時使用的混合加密機制,以及共享、公開密鑰加密的介紹。

HTTPS在信息傳輸時使用的混合加密機制&#xff0c;其中包括了共享密鑰加密和公開密鑰加密&#xff0c;我們先來介紹一下這兩種加密方式。 共享密鑰加密&#xff08;對稱密鑰&#xff09; 對稱加密是指加密和解密使用的是同一個密鑰。就像家里的門鎖&#xff0c;鑰匙只有一把&…

Oracle 23ai Vector Search 系列之4 VECTOR數據類型和基本操作

文章目錄 Oracle 23ai Vector Search 系列之4 VECTOR數據類型和基本操作VECTOR 數據類型基本語法Vector 維度限制和向量大小向量存儲格式&#xff08;DENSE vs SPARSE&#xff09;1. DENSE存儲2. SPARSE存儲3. 內部存儲與空間計算 Oracle VECTOR數據類型的聲明格式VECTOR基本操…

機器學習——ROC曲線、PR曲線

一、ROC曲線簡介 1.1 ROC曲線的構成 1.橫軸&#xff08;假正率&#xff0c;FPR&#xff09;&#xff1a; 表示負樣本被錯誤分類為正的比例&#xff08;越小越好&#xff09; 2.縱軸&#xff08;真正率&#xff0c;TPR&#xff0c;即召回率&#xff09;&#xff1a; 表示正樣…

IntelliJ IDEA下開發FPGA——FPGA開發體驗提升__上

前言 由于Quartus寫代碼比較費勁&#xff0c;雖然新版已經有了代碼補全&#xff0c;但體驗上還有所欠缺。于是使用VS Code開發&#xff0c;效果如下所示&#xff0c;代碼樣式和基本的代碼補全已經可以滿足開發&#xff0c;其余工作則交由Quartus完成 但VS Code的自帶的git功能&…

昂貴的DOM操作:一次DOM導致的性能問題排查記錄

公司來了一個前端實習生&#xff0c;踏實&#xff0c;勤快&#xff0c;很快得到老大的認可&#xff0c;分配給她一個需求&#xff0c;大概如下&#xff1a;構建一個公司產品的評論展示頁面&#xff0c;頁面可以滾動加載新的內容&#xff0c;同時如果已經加載的內容發生變化&…

前端服務配置詳解:從入門到實戰

前端服務配置詳解&#xff1a;從入門到實戰 一、環境配置文件&#xff08;.env&#xff09; 1.1 基礎結構 在項目根目錄創建 .env 文件&#xff1a; # 開發環境 VUE_APP_API_BASE_URL http://localhost:3000/api VUE_APP_VERSION 1.0.0# 生產環境&#xff08;.env.produc…

【學習筆記】計算機網絡(七)—— 網絡安全

第7章 網絡安全 文章目錄 第7章 網絡安全7.1 網絡安全問題概述7.1.1 計算機網絡面臨的安全性威脅7.1.2 安全的計算機網絡7.1.3 數據加密模型 7.2 兩類密碼體制7.2.1 對稱密鑰密碼體制7.2.2 公鑰密碼體制 7.3 鑒別7.3.1 報文鑒別7.3.2 實體鑒別 7.4 密鑰分配7.4.1 對稱密鑰的分配…

我用Cursor + DeepSeek + Claude-3.7-Sonnet + DevBox,10分鐘開發了一個系統

大家好&#xff0c;我是袁庭新。Cursor最近可謂是火的一塌糊涂&#xff0c;于是我深度體驗了一波。我用的環境是Cursor Claude-3.7-Sonnet DevBox&#xff0c;整個過程我一行代碼都沒有寫&#xff0c;10分鐘幫我開發了一個系統&#xff0c;且前后端聯調一把通過。驚出一身冷汗…

SpringBoot企業級開發之【用戶模塊-登錄】

開發之前我們先看一下接口文檔的要求&#xff1a; 開發思路&#xff1a; 開發實操&#xff1a; 因為我們之前開發注冊的時候&#xff0c;就有了一些相關的操作&#xff0c;所以在這里我們只需要定義登錄的controller即可&#xff1a; //用戶登錄PostMapping("/login"…

mysql 8.0.27-docker

安裝 可以略過本步 https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/ 鏡像查詢與安裝 先查詢&#xff1a; docker search mysql 明顯會報錯 Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp…

Pgvector的安裝

Pgvector的安裝 向量化數據的存儲&#xff0c;可以為 PostgreSQL 安裝 vector 擴展來存儲向量化數據 注意&#xff1a;在安裝vector擴展之前&#xff0c;請先安裝Postgres數據庫 vector 擴展的步驟 1、下載vs_BuildTools 下載地址&#xff1a; https://visualstudio.microso…

Python高階函數-sorted(深度解析從原理到實戰)

一、sorted()函數概述 sorted()是Python內置的高階函數&#xff0c;用于對可迭代對象進行排序操作。與列表的sort()方法不同&#xff0c;sorted()會返回一個新的已排序列表&#xff0c;而不改變原數據。 基本語法 sorted(iterable, *, keyNone, reverseFalse)二、核心參數詳…

ArcGIS Pro/GeoScene Pro AI 助手 2.1

引言 面對ArcGIS Pro/GeoScene Pro復雜的操作界面和腳本開發需求&#xff0c;你是否還在為功能定位、代碼調試和效率優化而煩惱&#xff1f;今天&#xff0c;推出自制的Pro AI助手2.0版本&#xff0c;七大核心功能將革新你的GIS工作方式&#xff01;無論是界面操作指引、一鍵生…

如何將本地更改的README文件同步到自己的GitHub項目倉庫

如何將本地更改的 README 文件同步到 GitHub 倉庫 在你 git clone 下來的工程目錄下&#xff1a; 先使用 robocopy YOUR\SOURCE\CODE\DIR YOUR\GIT\CLONE\DIR /E /XD .git /DCOPY:T 將你的更改Copy到你git下來的工程中&#xff08;上面的命令會自動處理&#xff0c;例如只會C…