首页
/
每日頭條
/
科技
/
linux中c語言讀取配置文件
linux中c語言讀取配置文件
更新时间:2024-11-30 00:05:17

是操作系統提供的、與用戶程序之間的接口,也就是操作系統提供給程序員的接口。從感覺上系統調用類似于過程調用,都由程序代碼構成,使用方式相同,但兩者有實質差别:過程調用隻能在用戶态下運行,不能進入核心态;而系統調用可以實現從用戶态到核心态的轉變。

linux中c語言讀取配置文件(一文講解linux-文件系統調用-基于C語言)1

Linux文件描述符

文件描述符fd是進程打開文件列表中的序号,它是一個0~255的整數。文件描述符0、1、2分别用于表示标準輸入、标準輸出和标準錯誤文件。進程打開一個文件後,就一直使用文件描述符fd來對文件進行标識并進行各種操作,它是文件正在被進程使用的标志。

linux中c語言讀取配置文件(一文講解linux-文件系統調用-基于C語言)2

open系統調用

調用open可以打開或創建一個文件。

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int oflag, ... /* mode_t mode */);

返回:若成功為文件描述符,若出錯為- 1

我們将第三個參數寫為. . .,這是ANSI C說明餘下參數的數目和類型可以變化的方法。對于open函數而言,僅當創建新文件時才使用第三個參數。在函數原型中此參數放置在注釋中。

第一個參數**pathname*是要打開或創建的文件的名字。

第二個參數oflag參數可用來說明此函數的多個選擇項。用下列一個或多個常數進行或運算構成oflag*參數(這些常數定義在< fcntl . h >頭文件中, 在這三個常數中應當隻指定一個):

  • O_RDONLY 隻讀打開
  • O_WRONLY 隻寫打開
  • O_RDWR 讀、寫打開

第三個可選參數:

  • O_APPEND 每次寫時都加到文件的尾端。
  • O_CREAT 若此文件不存在則創建它。使用此選擇項時,需同時說明第三個參數mode,用其說明該新文件的存取許可權位。
  • O_EXCL 如果同時指定了O_CREAT,而文件已經存在,則出錯。這可測試一個文件是否存在。
  • O_TRUNC 如果此文件存在,而且為隻讀或隻寫成功打開,則将其長度截短為0。
  • O_NONBLOCK 如果pathname指的是一個FIFO、一個塊特殊文件或一個字符特殊文件,則此選擇項為此文件的本次打開操作和後續的I / O操作設置非阻塞方式。
  • O_SYNC 使每次write都等到物理I / O操作完成。

由open函數返回的文件描述符一定是最小的未用描述符數字。

舉例:

int fd; //定義一個整型的文件描述符 char path[]=“/proc/version” //記錄Linux内核版本的文件 fd=open(path,O_RDONLY) //以隻讀方式打開

更多linux内核視頻教程文檔資料免費領取後台私信【内核】自行獲取.

linux中c語言讀取配置文件(一文講解linux-文件系統調用-基于C語言)3

linux中c語言讀取配置文件(一文講解linux-文件系統調用-基于C語言)4

Linux鍐呮牳婧愮爜/鍐呭瓨璋冧紭/鏂囦歡绯葷粺/杩涚▼绠$悊/璁懼椹卞姩/缃戠粶鍗忚鏍�-瀛︿範瑙嗛鏁欑▼-鑵捐璇懼爞

close調用

可用close關閉一個打開文件:

#include <unistd.h> int close (int fd);

返回:若成功為0,若出錯為-1

關閉一個文件時也釋放該進程加在該文件上的所有記錄鎖。當一個進程終止時,它所有的打開文件都由内核自動關閉。

lSEEK調用

每個打開的文件都有一個與其相關聯的“當前文件位移量”。它是一個非負整數,用以度量從文件開始處計算的字節數。通常,讀、寫操作都從當前文件位移量處開始,并使位移量增加所讀或寫的字節數。按系統默認,當打開一個文件時,除非指定O_APPEND選擇項,否則該位移量被設置為0。

#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence) ;

返回:若成功為新的文件位移,若出錯為-1

對參數offset 的解釋與參數whence的值有關

  • 若whence是SEEK_SET,則将該文件的位移量設置為距文件開始處offset 個字節
  • 若whence是SEEK_CUR,則将該文件的位移量設置為其當前值加offset, offset可為正或負
  • 若whence是SEEK_END,則将該文件的位移量設置為文件長度加offset, offset可為正或負

若lseek成功執行,則返回新的文件位移量,為此可以用下列方式确定一個打開文件的當前位移量:

off_t currpos; currpos = lseek(fd, 0, SEEK_CUR);

這種方法也可用來确定所涉及的文件是否可以設置位移量。如果文件描述符引用的是一個管道或FIFO,則lseek返回-1,并将errno設置為EPIPE。

lseek僅将當前的文件位移量記錄在内核内,它并不引起任何I / O操作。然後,該位移量用于下一個讀或寫操作。

文件位移量可以大于文件的當前長度,這種情況下,對該文件的下一次寫将延長該文件并在文件中構成一個空洞,這一點是允許的。位于文件中但沒有寫過的字節都被讀為0。

read調用

用read從打開的文件中讀數據。

#include <unistd.h> ssize_t read(int fd, void *buff, size_t nbytes) ;

返回:讀到的字節數,若已到文件尾為0,若出錯為-1

write調用

用write函數向打開文件寫數據。

#include <unistd.h> ssize_t write(int fd, const void *buf, size_t nbytes) ;

返回:若成功為已寫的字節數,若出錯為-1

其返回值通常與參數nbytes的值不同,否則表示出錯。write出錯的一個常見原因是:磁盤已寫滿,或者超過了對一個給定進程的文件長度限制。

對于普通文件,寫操作從文件的當前位移量處開始。如果在打開該文件時,指定了O_APPEND選擇項,則在每次寫操作之前,将文件位移量設置在文件的當前結尾處。在一次成功寫之後,該文件位移量增加實際寫的字節數。

unlink調用

unlink()函數功能即為删除文件。執行unlink()函數會删除所給參數指定的文件。

#include<unistd.h> int unlink(const char *pathname); // pathname:指定要移除的鍊接文件。

成功返回0;失敗則返回-1,同時設置errno為相應值。

執行unlink()函數并不一定會真正的删除文件,它先會檢查文件系統中此文件的連接數是否為1,如果不是1說明此文件還有其他鍊接對象,因此隻對此文件的連接數進行減1操作。若連接數為1,并且在此時沒有任何進程打開該文件,此内容才會真正地被删除掉。在有進程打開此文件的情況下,則暫時不會删除,直到所有打開該文件的進程都結束時文件就會被删除。

文件鎖

fcntl函數可以改變已經打開文件的性質。

#include <sys/types.h> #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd,.../* int arg * / );

返回:若成功則依賴于cmd(見下),若出錯為-1

  • fcntl函數有5種功能:
  • 複制一個現有的描述符(cmd=F_DUPFD).
  • 獲得/設置文件描述符标記(cmd=F_GETFD或F_SETFD).
  • 獲得/設置文件狀态标記(cmd=F_GETFL或F_SETFL).
  • 獲得/設置異步I/O所有權(cmd=F_GETOWN或F_SETOWN).
  • 獲得/設置記錄鎖(cmd=F_GETLK,F_SETLK或F_SETLKW).

當多個用戶共同使用、操作一個文件也即文件共享的情況下,Linux通常采用給文件上鎖的方法來避免産生競争。

文件鎖的數據結構:

struct flock{ short l_type; // 鎖類型,可取值為F_RDLCK、F_WRLCK、F_UNLCK off_t l_start; // 相對偏移量 short l_whence; // 位移量起點:SEEK_SET文件開頭、SEEK_CUR文件指針當前位置、SEEK_END文件尾 off_t l_len; // 加鎖區域長度 pid_t l_pid; // 加鎖進程的進程号 }

拓展

/proc 文件系統是一種内核和内核模塊用來向進程 (process) 發送信息的機制。這個僞文件系統讓你可以和内核内部數據結構進行交互,獲取有關進程的有用信息,在運行中改變設置。與其他文件系統不同,/proc 存在于内存之中而不是硬盤上。proc 文件系統可以被用于收集有用的關于系統和運行中的内核的信息。

下面是一些重要的文件:

  • /proc/cpuinfo - CPU 的信息 (型号, 家族, 緩存大小等)
  • /proc/meminfo - 物理内存、交換空間等的信息
  • /proc/mounts - 已加載的文件系統的列表
  • /proc/devices - 可用設備的列表
  • /proc/filesystems - 被支持的文件系統
  • /proc/modules - 已加載的模塊
  • /proc/version - 内核版本
  • /proc/cmdline - 系統啟動時輸入的内核命令行參數

有一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每一個進程在/proc下都對應一個以進程号為目錄名的目錄/proc/pid,它們是讀取進程信息的接口。

通過 /proc 中可讀寫的文件提供了對内核的交互機制。寫這些文件可以改變内核的狀态。大部分 /proc 的文件是隻讀的,/proc/sys 目錄存放所有可讀寫的文件的目錄,可以被用于改變内核行為, /proc/sys/kernel目錄包含反通用内核行為的信息。

實驗

編寫兩個源代碼文件read_lock.c和write_lock.c,分别調用lock_set函數對文件加讀鎖和寫鎖。

// lock.c 實現加鎖 #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> int lock_set(int fd,int type) { struct flock old_lock,lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = type; lock.l_pid = -1; fcntl(fd,F_GETLK,&lock); if(lock.l_type != F_UNLCK) { if(lock.l_type == F_RDLCK) printf("Read lock already set by %d\n",lock.l_pid); else if(lock.l_type == F_WRLCK) printf("Write lock already set by %d\n",lock.l_pid); } lock.l_type = type; if((fcntl(fd,F_SETLKW,&lock)) < 0) { printf("Lock failed:type = %d\n",lock.l_type); return 1; } switch(lock.l_type) { case F_RDLCK: printf("Read lock set by %d\n",getpid()); break; case F_WRLCK: printf("Write lock set by %d\n",getpid()); break; case F_UNLCK: printf("Release lock set by %d\n",getpid()); return 1; break; default: break; } return 0; }// 讀鎖 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include "lock.c" int main(){ char filepath[] = "./test"; int fd = open(filepath, O_RDONLY); lock_set(fd, F_RDLCK); getchar(); return 0; }// 寫鎖 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include "lock.c" int main(){ char filepath[] = "./test"; int fd = open(filepath, O_WRONLY); lock_set(fd, F_WRLCK); getchar(); return 0; }

原文地址:linux-鏂囦歡绯葷粺璋冪敤-鍩轟簬C璇█ - 澶滈〉瀛� - 鍗氬鍥�

linux中c語言讀取配置文件(一文講解linux-文件系統調用-基于C語言)5

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
手機碰磁鐵會怎麼樣
手機碰磁鐵會怎麼樣
不管智能手機怎麼發展,一旦它們靠近磁鐵,人們就會開始擔心屏幕被扭曲、存儲的重要文件被抹除,磁鐵似乎變成了手機殺手,事實真的是這樣的嗎?我們有必要分析一下磁鐵可能對手機造成的影響,消除未知的恐懼。人們之所以會産生磁鐵能夠毀掉數碼設備的擔心,是...
2024-11-30
一個手機号可以注冊兩個微信号嗎
一個手機号可以注冊兩個微信号嗎
一個手機号可以注冊兩個微信号嗎?一個手機号碼可以注冊兩個微信,在注冊第二個微信前,用戶需要将第一個微信綁定的手機号更換成其它手機号首先打開微信,然後在微信底部找到并打開“我的”,接着找到并打開“設置”,點擊打開後,選擇“賬号與安全”,接着點...
2024-11-30
新系統流的末世小說排行榜
新系統流的末世小說排行榜
《末世反派重生》來源:番茄小說字數:116萬字标簽:末世|科幻|基建|種田|完結點評:很好的一篇文,女主前世遭遇折磨,今生隻想毀滅世界卻被系統逼着做好人,時冷時熱被大家以為人格分裂。而她也從冷血無情慢慢被男主及救下的隊友感化真的變成了一個好...
2024-11-30
拍照續航性價比比較高的手機推薦
拍照續航性價比比較高的手機推薦
端午假期就要來了。除了吃喝玩樂外,大家最關心的就是在各種景點拍照打卡的問題了。但關于“端午拍照如何選機”問題,很多人都會糾結是入手長續航機型的好,還是選拍照強的機型好。不再糾結,成年人當然是全都要!今天咱們來聊聊這6款手機值得入手的拍照手機...
2024-11-30
excel怎麼快速隔行插行
excel怎麼快速隔行插行
累計1000學員通過我們的核心系列課《48天,Excel技能脫胎換骨》完成職場逆襲,何不也給自己一次脫胎換骨的機會,點擊卡片了解詳情。接下來的欄目是我們新推出的圖文教程,每天3分鐘,讓你掌握100個Excel技能,教程全部以圖片的方式呈現,...
2024-11-30
Copyright 2023-2024 - www.tftnews.com All Rights Reserved