C語言文件操作-文件IO(系統調用)

  • 文件IO (系統調用)
    • 文件描述符
    • open函數
    • read函數
    • write函數
    • lseek函數
    • close函數
    • dup函數
    • dup2函數
  • stat函數
  • getpwuid函數
  • getgrgid函數
    • 實例
  • 目錄操作
    • opendir函數
    • readdir函數
    • rewinddir函數
    • closedir函數
    • 實例

文件IO (系統調用)

文件IO就是系統調用,用戶空間進入內核空間的過程就是系統調用。
系統調用沒有緩沖機制,效率較低,可移植性也相對較差,實時性高。

文件描述符

文件描述符是使用open函數打開文件時的返回值

對文件的讀寫操作,就是通過文件描述符來完成的。

文件描述符是一個整數,在一個程序中文件描述符的范圍0-1023共計1024個,

使用 uilmit -a 可以查看一個程序中可以打開的文件的個數限制

(open files 后面對應的就是 這個值也可以使用命令 ulimit -n 2048來修改 但一般都是用默認值)

在一個程序啟動的過程中,默認就會打開三個描述符(0 1 2),

分別對應標準輸入、標準輸出、標準錯誤。

其他文件描述符需要通過open函數來打開文件,并獲得文件描述符。

文件描述符依次遞增,文件描述符遵循復用原則,文件描述符關閉后,這個符號就空閑了,可以被其他程序使用.

open函數

open函數用來打開文件,并返回文件描述符。

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

參數:

  • pathname:要打開的文件的路徑名
  • flags:打開文件的方式,可以是以下值:
    • O_RDONLY:只讀方式打開

    • O_WRONLY:只寫方式打開

    • O_RDWR:讀寫方式打開

    • O_CREAT:如果文件不存在,則創建文件

      • 如果指定了這個宏,則第三個參數 mode 必須填
      • 創建文件的權限還得涉及 掩碼 umask
      • umask的值 默認為 0002 這個值也可以改的
      • 最終的權限 = (mode & ~umask)
      • 所以 即使給的是 0666 最終的權限也是 0664
    • O_APPEND:在文件尾部追加內容

    • O_TRUNC:如果文件存在,清空

    • O_EXCL:如果文件存在,則返回錯誤,錯誤碼:EEXIST

  • mode:文件權限,一般八進制表示;

返回值:

  • 成功:返回文件描述符
  • 失敗:返回-1,并設置errno

read函數

read函數用來從文件中讀取內容。

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

參數:

  • fd:文件描述符
  • buf:讀取到的數據存放的緩沖區
  • count:要讀取的字節數

返回值:

  • 成功:返回實際讀取的字節數
  • 失敗:返回-1,并設置errno

write函數

write函數用來向文件中寫入內容。

函數原型:

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

參數:

  • fd:文件描述符
  • buf:要寫入的數據存放的緩沖區
  • count:要寫入的字節數

返回值:

  • 成功:返回實際寫入的字節數
  • 失敗:返回-1,并設置errno

lseek函數

lseek函數用來移動文件讀寫指針的位置。

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

參數:

  • fd:文件描述符
  • offset:相對于 whence 的偏移量
  • whence:
    • SEEK_SET:相對于文件開始位置
    • SEEK_CUR:相對于當前位置
    • SEEK_END:相對于文件結束位置

返回值:

  • 成功:返回新的文件位置
  • 失敗:返回-1,并設置errno

close函數

close函數用來關閉文件。

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

參數:

  • fd:文件描述符

返回值:

  • 成功:返回0
  • 失敗:返回-1,并設置errno

dup函數

dup函數用來復制文件描述符。

#include <unistd.h>int dup(int oldfd);

參數:

  • oldfd:被復制的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失敗:返回-1,并設置errno

dup2函數

dup2函數用來復制文件描述符并修改文件描述符。

#include <unistd.h>int dup2(int oldfd, int newfd);

參數:

  • oldfd:被復制的文件描述符
  • newfd:新的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失敗:返回-1,并設置errno
  • 注意:如果newfd已經打開,則先關閉它。

stat函數

stat函數用來獲取文件屬性信息。

函數原型:

#include <sys/stat.h>int stat(const char *pathname, struct stat *buf);

參數:

  • pathname:文件路徑名
  • buf:存放文件屬性信息的結構體

返回值:

  • 成功:返回0
  • 失敗:返回-1,并設置errno

結構體stat的定義如下:

struct stat {dev_t     st_dev;     //磁盤設備號ino_t     st_ino;     //inode節點號mode_t    st_mode;    //文件類型和權限st_mode & S_IFMT(0777) -> 文件權限獲取文件的類型的方式: st_mode & S_IFMT 文件的類型S_IFMT     0170000   獲取類型的掩碼S_IFSOCK   0140000   套接字文件S_IFLNK    0120000   軟鏈接文件S_IFREG    0100000   普通文件S_IFBLK    0060000   塊設備文件S_IFDIR    0040000   目錄文件S_IFCHR    0020000   字符設備文件S_IFIFO    0010000   管道文件例如:判斷文件是否是普通文件if((stat.st_mode & S_IFMT) == S_IFREG)或者:if(S_ISREG(stat.st_mode))nlink_t   st_nlink;   //鏈接數uid_t     st_uid;     //所有者用戶IDgid_t     st_gid;     //所有者組IDdev_t     st_rdev;    //設備號(若此對象為設備文件)off_t     st_size;    //文件大小(字節數)blksize_t st_blksize; //塊大小(字節數)blkcnt_t  st_blocks;  //塊數time_t    st_atime;   //最后訪問時間time_t    st_mtime;   //最后修改時間time_t    st_ctime;   //最后狀態改變時間#define st_atime st_atim.tv_sec//最后訪問時間#define st_mtime st_mtim.tv_sec//最后修改時間#define st_ctime st_ctim.tv_sec//最后狀態改變時間
};

函數: int lstat(const char *pathname, struct stat *statbuf);

可以獲取鏈接的屬性

getpwuid函數

getpwuid函數用來獲取用戶信息。

函數原型:

#include <pwd.h>struct passwd *getpwuid(uid_t uid);

參數:

  • uid:用戶ID

返回值:

  • 成功:返回指向passwd結構體的指針
  • 失敗:返回NULL,并設置errno

passwd結構體的定義如下:

struct passwd {char    *pw_name;    //用戶名char    *pw_passwd;  //密碼uid_t    pw_uid;     //用戶IDgid_t    pw_gid;     //組IDchar    *pw_gecos;   //用戶信息char    *pw_dir;     //用戶主目錄char    *pw_shell;   //用戶登錄shell
};

getgrgid函數

getgrgid函數用來獲取組信息。

函數原型:

#include <grp.h>struct group *getgrgid(gid_t gid);

參數:

  • gid:組ID

返回值:

  • 成功:返回指向group結構體的指針
  • 失敗:返回NULL,并設置errno

group結構體的定義如下:

struct group {char   *gr_name;    //組名char   *gr_passwd;  //組密碼gid_t   gr_gid;     //組IDchar  **gr_mem;     //組成員列表
};

實例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>int main()
{int fd;char buf[1024];struct passwd *pw;struct group *gr;struct stat st;//打開文件fd = open("test.txt", O_RDONLY, 0666);if (fd == -1) {perror("open");exit(1);}//讀取文件內容read(fd, buf, 1024);printf("%s\n", buf);//關閉文件close(fd);//獲取文件屬性if (stat("test.txt", &st) == -1) {perror("stat");exit(1);}//獲取文件所有者信息pw = getpwuid(st.st_uid);if (pw == NULL) {perror("getpwuid");exit(1);}printf("owner: %s\n", pw->pw_name);//獲取文件所屬組信息gr = getgrgid(st.st_gid);if (gr == NULL) {perror("getgrgid");exit(1);}printf("group: %s\n", gr->gr_name);return 0;
} 

目錄操作

opendir函數

opendir函數用來打開目錄。

函數原型:

#include <dirent.h>DIR *opendir(const char *name);

參數:

  • name:目錄路徑名

返回值:

  • 成功:返回指向DIR結構體的指針
  • 失敗:返回NULL,并設置errno

DIR結構體:

struct dirent {ino_t     d_ino;     //inode節點號off_t     d_off;     //目錄偏移量unsigned short d_reclen; //目錄項長度unsigned char  d_type;  //目錄項類型char        d_name[NAME_MAX+1]; //目錄項名
};

readdir函數

readdir函數用來讀取目錄中的文件信息。

函數原型:

#include <dirent.h>struct dirent *readdir(DIR *dirp);

參數:

  • dirp:指向DIR結構體的指針

返回值:

  • 成功:返回指向dirent結構體的指針
  • 失敗:返回NULL,并設置errno

dirent結構體的定義如下:

struct dirent {ino_t     d_ino;     //inode節點號off_t     d_off;     //目錄偏移量unsigned short d_reclen; //目錄項長度unsigned char  d_type;  //目錄項類型char        d_name[NAME_MAX+1]; //目錄項名
};

rewinddir函數

rewinddir函數用來將目錄讀寫指針指向文件頭。

函數原型:

#include <dirent.h>void rewinddir(DIR *dirp);

參數:

  • dirp:指向DIR結構體的指針

返回值:

closedir函數

closedir函數用來關閉目錄。

函數原型:

#include <dirent.h>int closedir(DIR *dirp);

參數:

  • dirp:指向DIR結構體的指針

返回值:

  • 成功:返回0
  • 失敗:返回-1,并設置errno

實例

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>int main()
{DIR *dir;struct dirent *dp;struct stat st;//打開目錄dir = opendir(".");if (dir == NULL) {perror("opendir");exit(1);}//讀取目錄中的文件信息while ((dp = readdir(dir)) != NULL) {printf("%s\n", dp->d_name);//獲取文件屬性if (lstat(dp->d_name, &st) == -1) {perror("lstat");exit(1);}//判斷文件類型if (S_ISDIR(st.st_mode)) {printf("d");} else if (S_ISREG(st.st_mode)) {printf("-");} else if (S_ISLNK(st.st_mode)) {printf("l");} else if (S_ISFIFO(st.st_mode)) {printf("p");} else if (S_ISSOCK(st.st_mode)) {printf("s");} else {printf("?");}//獲取文件所有者信息printf(" %d/%d ", st.st_uid, st.st_gid);//獲取文件大小printf("%ld ", st.st_size);//獲取文件修改時間printf("%s ", ctime(&st.st_mtime));}//關閉目錄closedir(dir);return 0;
} 

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

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

相關文章

2024年信息系統項目管理師1批次上午客觀題參考答案及解析(3)

51、探索各種選項&#xff0c;權衡包括時間與成本、質量與成本、風險與進度、進度與質量等多種因素&#xff0c;在整個過程中&#xff0c;舍棄無效或次優的替代方案&#xff0c;這種不確定性應對方法是()。 A&#xff0e;集合設計 B&#xff0e;堅韌性 C&#xff0e;多種結果…

離線運行Llama3:本地部署終極指南_liama2 本地部署

4月18日&#xff0c;Meta在官方博客官宣了Llama3&#xff0c;標志著人工智能領域邁向了一個重要的飛躍。經過筆者的個人體驗&#xff0c;Llama3 8B效果已經超越GPT-3.5&#xff0c;最為重要的是&#xff0c;Llama3是開源的&#xff0c;我們可以自己部署&#xff01; 本文和大家…

衡量股票價值的尺度

勞倫女士說&#xff0c;“鄧普頓獵取便宜股的時候&#xff0c;總是運用證券分析師的‘一百種價值衡量尺度’中的好幾種。 原因之一呢&#xff0c;就是因為任何一種衡量方法都是萬能的&#xff0c;在不同的時期、不同的市場環境下&#xff0c;總會有它自己的局限性。就像有朋友…

大數據------JavaWeb------FilterListenerAJAXAxiosJSON

Filter Filter簡介 定義&#xff1a;Filter表示過濾器&#xff0c;是JavaWeb三大組件&#xff08;Servlet、Filter、Listener&#xff09;之一。 作用&#xff1a;它可把對資源&#xff08;Servlet、JSP、Html&#xff09;的請求攔截下來從而實現一些特殊功能 過濾器一般完成…

【QT中實現攝像頭播放、以及視頻錄制】

學習分享 1、效果圖2、camerathread.h3、camerathread.cpp4、mainwindow.h5、mainwindow.cpp6、main.cpp 1、效果圖 2、camerathread.h #ifndef CAMERATHREAD_H #define CAMERATHREAD_H#include <QObject> #include <QThread> #include <QDebug> #include &…

SAP顧問的核心競爭力是什么?

最近看到幾個業內大佬在討論這個話題&#xff0c;我也想談談我的看法。這位大佬的原話是“SAP顧問的核心技能不是配置軟件&#xff0c;而是對財務、供應鏈、銷售等運行流程的理解&#xff0c;解決的是企業流程和數據標準化的問題。” 我先不做評價&#xff0c;我先問幾個問題。…

選擇排序(C語言版)

選擇排序是一種簡單直觀的排序算法 算法實現 首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置。 再從剩余未排序元素中繼續尋找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列的末尾。 重復第二步&…

【k8s安裝redis】k8s安裝單機版redis實現高性能高可用

文章目錄 簡介一.條件及環境說明&#xff1a;二.需求說明&#xff1a;三.實現原理及說明四.詳細步驟4.1.創建configmap 配置文件4.2.創建StatefulSet 配置4.3.創建service headless 配置 五.安裝說明 簡介 本文將根據在k8s環境中搭建【偽】單機模式的redis實例。由于共享存儲的…

020-GeoGebra中級篇-幾何對象之點與向量

本文概述了在GeoGebra中如何使用笛卡爾或極坐標系輸入點和向量。用戶可以通過指令欄輸入數字和角度&#xff0c;使用工具或指令創建點和向量。在笛卡爾坐標系中&#xff0c;示例如“P(1,0)”&#xff1b;在極坐標系中&#xff0c;示例如“P(1;0)”或“v(5;90)”。文章還介紹了點…

深入理解循環神經網絡(RNN)

深入理解循環神經網絡&#xff08;RNN&#xff09; 循環神經網絡&#xff08;Recurrent Neural Network, RNN&#xff09;是一類專門處理序列數據的神經網絡&#xff0c;廣泛應用于自然語言處理、時間序列預測、語音識別等領域。本文將詳細解釋RNN的基本結構、工作原理以及其優…

uniapp本地打包到Android Studio生成APK文件

&#xff08;1&#xff09;安裝 Android Studio 軟件&#xff1b; 下載地址&#xff1a;官方下載地址&#xff0c;英文環境 安裝&#xff1a;如下之外&#xff0c;其他一鍵 next &#xff08;2&#xff09;配置java環境&#xff1b; 下載&#xff1a;j…

基于SpringBoot構造超簡易QQ郵件服務發送 第二版

目錄 追加 郵箱附件 添加依賴 編碼 測試 第二版的更新點是追加了 郵箱附件功能 ( 后期追加定時任務 ) 基于SpringBoot構造超簡易QQ郵件服務發送(分離-圖解-新手) 第一版 追加 郵箱附件 添加依賴 <!-- 電子郵件 --><dependency><groupId>org.spri…

Java小白入門到實戰應用教程-介紹篇

writer:eleven 介紹 編程語言介紹 編程語言按照抽象層次和硬件交互的方式劃分為低級編程語言和高級編程語言。 低級編程語言更接近計算機硬件層面&#xff0c;通常具有執行效率高的特點&#xff0c;但是由于注重計算機底層交互&#xff0c;所以編程難度相對較大。 高級編程…

國內開源RAG知識庫ChatWiki MaxKb QAnyThing對比

RAG 知識庫 &#xff0c; 是一個比較火的賽道&#xff0c;以下是國內開源的RAG 知識庫 ChatWiki 芝麻小客服開源的一個RAG 知識庫&#xff0c;核心特點是和人工聊天系統打通&#xff0c;可以作為對外的聊天系統使用。 開源地址 https://github.com/zhimaAi/chatwiki 云端體…

如何評價Flutter?

哈嘍&#xff0c;我是老劉 我們團隊使用Flutter已經快6年了。 有很多人問過我們對Flutter的評價。 今天在這里回顧一下6年前選擇Flutter時的原因&#xff0c;以及Flutter在這幾年中的實際表現如何。 選擇Flutter時的判斷 1、性能 最開始吸引我們的就是其優秀的性能。 特別是…

【vue3|第16期】初探Vue-Router與現代網頁路由

日期:2024年7月6日 作者:Commas 簽名:(? ?_?)? 積跬步以致千里,積小流以成江海…… 注釋:如果您覺得有所幫助,幫忙點個贊,也可以關注我,我們一起成長;如果有不對的地方,還望各位大佬不吝賜教,謝謝^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

力扣第226題“翻轉二叉樹”

在本篇文章中&#xff0c;我們將詳細解讀力扣第226題“翻轉二叉樹”。通過學習本篇文章&#xff0c;讀者將掌握如何使用遞歸和迭代的方法來翻轉二叉樹&#xff0c;并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋&#xff0c;以便于理解。 問題描述 力扣第…

深入探索聯邦學習框架 Flower

聯邦學習框架 本文主要期望介紹一個設計良好的聯邦學習框架 Flower&#xff0c;在開始介紹 Flower 框架的細節前&#xff0c;先了解下聯邦學習框架的基礎知識。 作為一個聯邦學習框架&#xff0c;必然會包含對橫向聯邦學習的支持。橫向聯邦是指擁有類似數據的多方可以在不泄露…

【CVPR 2024】GART: Gaussian Articulated Template Models

【CVPR 2024】GART: Gaussian Articulated Template Models 一、前言Abstract1. Introduction2. Related Work3. Method3.1. Template Prior3.2. Shape Appearance Representation with GMM3.3. Motion Representation with Forward Skinning3.4. Reconstruct GART from Monocu…

Java--instanceof和類型轉換

1.如圖&#xff0c;Object&#xff0c;Person&#xff0c;Teacher&#xff0c;Student四類的關系已經寫出來了&#xff0c;由于實例化的是Student類&#xff0c;因此&#xff0c;與Student類存在關系的類在使用instanceof時都會輸出True&#xff0c;而無關的都會輸出False&…