操作系統文件編程知識

文件的創建和讀寫

當我們需要打開一個文件進行讀寫操作的時候,我們可以使用系統調用函數open。使用完成以后我們調用另外一個close函數進行關閉操作。

該函數使用的頭文件如下:

#include <fcntl.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

定義函數:

int open(const char *pathname,int flags);

int open(const char *pathname,int flags,mode_t mode);

int close(int fd);

函數說明:

open函數有兩個形式。其中pathname是我們要打開的文件名(包含路徑名稱,缺省是認為在當前路徑下面)。flags可以取下面的一個值或者是幾個值的組合。?

O_RDONLY:以只讀的方式打開文件。?

O_WRONLY:以只寫的方式打開文件。

O_RDWR:以讀寫的方式打開文件。?

O_APPEND:以追加的方式打開文件。?

O_CREAT:創建一個文件。

O_EXEC:如果使用了O_CREAT而且文件已經存在,就會發生一個錯誤。

O_NOBLOCK:以非阻塞的方式打開一個文件。

O_TRUNC:如果文件已經存在,則刪除文件的內容。?

前面三個標志只能使用任意的一個。如果使用了O_CREATE標志,那么我們要使用open的第二種形式。還要指定mode標志,用來表示文件的訪問權限。mode可以是以下情況的組合。?

-----------------------------------------------------------------

S_IRUSR 用戶可以讀 S_IWUSR 用戶可以寫?

S_IXUSR 用戶可以執行 S_IRWXU 用戶可以讀寫執行

-----------------------------------------------------------------

S_IRGRP 組可以讀 S_IWGRP 組可以寫?

S_IXGRP 組可以執行 S_IRWXG 組可以讀寫執行

-----------------------------------------------------------------

S_IROTH 其他人可以讀 S_IWOTH 其他人可以寫?

S_IXOTH 其他人可以執行 S_IRWXO 其他人可以讀寫執行

-----------------------------------------------------------------

S_ISUID 設置用戶執行ID S_ISGID 設置組的執行ID?

-----------------------------------------------------------------

????我們也可以用數字來代表各個位的標志。Linux總共用5個數字來表示文件的各種權限。?

00000第一位表示設置用戶ID,第二位表示設置組ID,第三位表示用戶自己的權限位,第四位表示組的權限,最后一位表示其他人的權限。?每個數字可以取1(執行權限),2(寫權限),4(讀權限),0(什么也沒有)或者是這幾個值的和。比如我們要創建一個用戶讀寫執行,組沒有權限,其他人讀執行的文件。

設置用戶ID位可以使用的模式是:

1.(設置用戶ID)0(組沒有設置)7(1+2+4)0(沒有權限,使用缺省) 5(1+4)?10705

open("temp",O_CREAT,10705);

????如果我們打開文件成功,open會返回一個文件描述符。對文件的所有操作就可以對這個文件描述符進行操作。

????當我們操作完成以后,我們要關閉文件了,只要調用close就可以了,其中fd是我們要關閉的文件描述符。

????文件打開了以后,就可以對文件進行讀寫了。可以調用函數read和write進行文件的讀寫。

該函數使用的頭文件:

#include <unistd.h>

函數定義:

ssize_t read(int fd, void *buffer,size_t count);

ssize_t write(int fd, const void *buffer,size_t count);

函數說明:

????fd是我們要進行讀寫操作的文件描述符,buffer是我們要寫入文件內容或讀出文件內容的內存地址,count是我們要讀寫的字節數。對于普通的文件read從指定的文件(fd)中讀取count字節到buffer緩沖區中(記住我們必須提供一個足夠大的緩沖區),同時返回count,如果read讀到了文件的結尾或者被一個信號所中斷,返回值會小于count。如果是由信號中斷引起返回,而且沒有返回數據,read會返回-1,且設置errno為EINTR。當程序讀到了文件結尾的時候,read會返回0。?

?????write從buffer中寫count字節到文件fd中,成功時返回實際所寫的字節數。?

2.文件的各個屬性

????文件具有各種各樣的屬性,除了我們上面所知道的文件權限以外,文件還有創建時間、大小等等屬性,有時侯我們要判斷文件是否可以進行某種操作(讀,寫等等)。這個時候我們可以使用access函數。

#include <unistd.h>

int access(const char *pathname,int mode);

pathname:是文件名稱,mode是我們要判斷的屬性。可以取以下值或者是他們的組合。?

R_OK文件可以讀

W_OK文件可以寫

X_OK文件可以執行

F_OK文件存在

????當我們測試成功時,函數返回0,否則如果有一個條件不符時,返回-1。如果我們要獲得文件的其他屬性,我們可以使用函數stat或者fstat。

#include <sys/stat.h>

#include <unistd.h>

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

int fstat(int filedes,struct stat *buf);

struct stat {

dev_t st_dev; ?/* 設備 */

ino_t st_ino; /* 節點 */

mode_t st_mode; /* 模式 */

nlink_t st_nlink; ?/* 硬連接 */

uid_t st_uid; /* 用戶ID */

gid_t st_gid; ?/* 組ID */

dev_t st_rdev; ?/* 設備類型 */

off_t st_off; ? /* 文件字節數 */

unsigned long st_blksize; /* 塊大小 */

unsigned long st_blocks; ?/* 塊數 */

time_t st_atime; ?/* 最后一次訪問時間 */

time_t st_mtime; ?/* 最后一次修改時間 */

time_t st_ctime; ?/* 最后一次改變時間(指屬性) */

};

Stat用來判斷沒有打開的文件,fstat用來判斷打開的文件。我們使用最多的屬性是st_ mode。通過著屬性我們可以判斷給定的文件是一個普通文件還是一個目錄,連接等等。可以使用下面幾個宏來判斷:

S_ISLNK(st_mode)是否是一個連接,S_ISREG是否是一個常規文件,S_ISDIR是否是一個目錄,S_ISCHR是否是一個字符設備,S_ISBLK是否是一個塊設備,S_ISFIFO是否是一個FIFO文件,S_ISSOCK是否是一個SOCKET文件。

目錄文件的操作:

????在我們編寫程序的時候,有時候會要得到我們當前的工作路徑。C庫函數提供了getcwd來解決這個問題。

#include <unistd.h>

char *getcwd(char *buffer,size_t size);

????我們提供一個size大小的buffer,getcwd會把我們當前的路徑考到buffer中。如果buffer 太小,函數會返回-1和一個錯誤號。?

Linux提供了大量的目錄操作函數,我們學習幾個比較簡單和常用的函數。?

#include <dirent.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

int mkdir(const char *path,mode_t mode);

DIR *opendir(const char *path);

struct dirent *readdir(DIR *dir);

void rewinddir(DIR *dir);

off_t telldir(DIR *dir);

void seekdir(DIR *dir,off_t off);

int closedir(DIR *dir);

struct dirent {

long d_ino;

off_t d_off;

unsigned short d_reclen;

char d_name[NAME_MAX+1]; /* 文件名稱 */

mkdir創建一個目錄,opendir打開一個目錄為以后讀做準備,readdir讀一個打開的目錄,rewinddir是用來重讀目錄,closedir是關閉一個目錄,telldir和seekdir類似與ftee和fseek函數。

轉載于:https://www.cnblogs.com/WangYiqiang/p/9561818.html

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

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

相關文章

論述HTML5平臺的若干重要特性

開發者已憑借網頁技術制作出創收豐厚的游戲作品許多年&#xff1a;《部落戰爭》憑借靜態網頁頁面大獲成功&#xff0c;《Farmville》憑借Flash開拓出新的疆域。但如今越來越多人覺得&#xff0c;未來HTML5將變成游戲的主要平臺。為什么HTML5如此頗具趣味&#xff0c;它是否真的…

多GPU使用詳解

目錄&#xff1a; 介紹 記錄設備狀態 手動分配狀態 允許GPU內存增長 在多GPU系統是使用單個GPU 使用多個 GPU 一、介紹 在一個典型的系統中&#xff0c;有多個計算設備。在 TensorFlow 中支持的設備類型包括 CPU 和 GPU。他們用字符串來表達&#xff0c;例如&#xff1a; “/cp…

圖片上傳的兩種方式

總的說圖片上傳有兩種方式&#xff0c;一種是把圖片文件寫到數據庫中&#xff0c;另一種是存到服務器文件目錄中。寫到數據庫中的圖片文件需要轉換成二進制流的格式&#xff0c;占用數據庫空間比較多&#xff0c;適合少量圖片的存儲&#xff0c;比如說&#xff0c;系統中某些小…

最好理解的: spring ioc原理講解,強烈推薦!

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IOC&#xff08;DI&#xff09;&#xff1a;java程序中的每個業務邏輯至少需要兩個或以上的對象來協作完成。通常&#xff0c;每個對象在…

微信小程序 - 回到自己位置(map)

演示效果&#xff1a; 圖片資源 index.js 1 /** 2 * 回到自己位置&#xff0c;在cover-image上綁定點擊事件即可. 3 */ 4 clickcontrol(e) { 5 let mpCtx wx.createMapContext("map"); 6 mpCtx.moveToLocation(); 7 }, 轉載于:https://www.cnbl…

uwsgi搭配nginx

uwsgi搭配nginx可以做域名解析和負載均衡uWSGI&#xff0c;既不用wsgi協議也不用fcgi協議&#xff0c;而是自創了一個uwsgi的協議&#xff0c;據說該協議大約是fcgi協議的10倍那么快。uWSGI的主要特點如下&#xff1a;◆超快的性能。◆低內存占用&#xff08;實測為apache2的mo…

如何讓tomcat服務器運行在80端口,并且無需輸入項目名即可訪問項目()

這個問題最開始遇到的時候是半年前,自己買了個服務器玩,但是域名解析的時候出了問題,我查了查資料才知道騰訊云是默認解析到80端口,而且還改不了. 首先是修改tomcat運行端口號,默認是8080,但是我們可以通過修改配置文件更改, 打開conf/server.xml文件找到這個地方,: 將8080改為…

tailf、tail -f、tail -F三者區別

tail -f 等同于--followdescriptor&#xff0c;根據文件描述符進行追蹤&#xff0c;當文件改名或被刪除&#xff0c;追蹤停止 tail -F 等同于--followname --retry&#xff0c;根據文件名進行追蹤&#xff0c;并保持重試&#xff0c;即該文件被刪除或改名后&#xff…

使用圖形芯片加速電子自動化設計應用程序

以往EDA應用性能瓶頸主要受兩方面因素制約&#xff0c;首先大多數應用都是單線程的&#xff0c;而CPU和GPU架構擁有幾十到數千的并行內核&#xff0c;其次是應用程序內存延遲問題。目前EDA應用已經部署到傳統的常規處理器上。最重要的是這些應用促使人們設計出并行或向量處理器…

自我介紹的四個套路

四套路內容&#xff1a; 1、我是誰&#xff0c;叫什么名字&#xff0c;我從哪里來。 2、我因為什么機緣出現這個場合。 3、我能給大家帶來什么價值。 4、我希望能夠得到大家的什么幫助。 示例&#xff1a; 大家好&#xff0c;我叫XXX&#xff0c; 聽說今天會有幾個高人在場&…

加載樣式js

var MaskUtil (function(){ var $mask,$maskMsg; var defMsg 數據導出中&#xff0c;請稍待。。。; function init(){ if(!$mask){ $mask $("<div class\"datagrid-mask mymask\"></div>").appendTo("body"); } if(!$mask…

flush privileges

flush privileges 命令本質上的作用是將當前user和privilige表中的用戶信息/權限設置從mysql庫(MySQL數據庫的內置庫)中提取到內存里。MySQL用戶數據和權限有修改后&#xff0c;希望在"不重啟MySQL服務"的情況下直接生效&#xff0c;那么就需要執行這個命令。通常是在…

【Linux】Linux中常用操作命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 常用指令 ls   顯示文件或目錄 -l 列出文件詳細信息l(list) -a 列出當前目錄下所有文件及目錄&#xff0…

Mybatis的緩存機制Cache

Mybatis提供對緩存的支持&#xff0c;分為一級緩存和二級緩存&#xff0c;在沒有配置的情況下&#xff0c;系統默認會使用一級緩存。 一級緩存&#xff08;SqlSession級別&#xff09; 我們都知道每個SqlSession對象之間的緩存是互不影響的&#xff0c;當同一個SqlSession執行多…

大數據應用時代來襲 SaaS走向沒落?

隨著大量的信息涌入互聯網——90%的互聯網是過去兩年建立起來的——互聯網公司正在想方設法去熟悉并利用大數據來推動他們的業務。正如SaaS和云技術一樣完全變革了企業的運作方式一樣&#xff0c;大數據應用&#xff08;BDA&#xff09;也同樣可以。 BDA是基于網絡的應用&#…

為什么使用數據庫從庫

主庫用來進行寫操作&#xff0c;從庫用來進行讀操作&#xff0c;這樣一來的可以大大提高讀取的效率。在一般的互聯網應用中&#xff0c;經過一些數據調查得出結論&#xff0c;讀/寫的比例大概在 10&#xff1a;1左右 &#xff0c;也就是說大量的數據操作是集中在讀的操作。但是…

Java程序員必知的10個調試技巧

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在本文中&#xff0c;作者將使用大家常用的的開發工具Eclipse來調試Java應用程序。但這里介紹的調試方法基本都是通用的&#xff0c;也適…

【GPS】GPS的C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT配置,Linux系統中GPIO的設置

GPS的GPIO配置文件 客戶需要更改此變量C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT才能覆蓋NAVRF驅動程序ELNA設置。   modem_proc/gps/gnss/mgp/me/gen8/src/cgps_ext.c /* Customer needs to change this variable in order to override NAVRF driver ELNA setting */ gnss_ExternalG…

學習的境界

學習是有境界的&#xff0c;下面以C語言中的結構型為例簡單分析。 第一種境界&#xff1a;理解了。 結構型是自定義數據類型&#xff0c;與C語言中基本的數據類型如int的作用相同&#xff0c;用于定義變量。&#xff08;變量是內存中存儲單元的標識&#xff0c;C語言中通過變…

性能測試的重要意義(一)

?我是一下下面幾個方面來理解的&#xff1a; 1.秒的性能對于顧客的意義&#xff1f; 2.性能測試的重要意義 3.什么是軟件的性能&#xff1f; 4.軟件的性能測試是什么&#xff1f; 5.功能測試和性能測試對比&#xff1f; 6.項目組不同角色眼中的軟件性能&#xff1f; 7.性能測試…