日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux系统编程——基于文件描述符的文件操作(1)

發布時間:2025/4/16 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统编程——基于文件描述符的文件操作(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概要:

  • 打開、創建和關閉文件
  • 讀寫文件
  • 文件定位
  • 獲取文件信息

打開、創建和關閉文件

函數原型:
#include <sys/types.h> //頭文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //文件名 打開方式
int open(const char *pathname, int flags, mode_t mode);//文件名 打開方式 權限

flags和mode都是一組掩碼的合成值,flags表示打開或創建的方式,mode表示文件的訪問權限。

flags 的選項:

  • O_CREAT參數:
#include <func.h> int main(int argc,char* argv[]) {ARGS_CHECK(argc,2);int fd;fd=open(argv[1],O_RDONLY|O_CREAT);ERROR_CHECK(fd,-1,"open");printf("fd=%d\n",fd);return 0; }

open()函數出錯時返回-1,創建成功時返回未使用的最小文件描述符

0 標準輸入符

1 標準輸出符

2 標準錯誤輸出符

故該代碼中open()返回值為3

  • O_CREAT加自定義權限:

當輸入的文件名不存在時,自動創建文件,但該文件權限是有問題的,所以在open()函數后加上自定義權限參數

#include <func.h>int main(int argc,char* argv[]) {ARGS_CHECK(argc,2);int fd;fd=open(argv[1],O_RDONLY|O_CREAT,0600);ERROR_CHECK(fd,-1,"open");printf("fd=%d\n",fd);return 0; }

若文件已存在則跳出,否則創建文件:

#include <func.h>int main(int argc,char* argv[]) {ARGS_CHECK(argc,2);int fd;fd=open(argv[1],O_RDONLY|O_CREAT|O_EXCL,0600);ERROR_CHECK(fd,-1,"open");printf("fd=%d\n",fd);return 0; }

TRUNK參數:若文件已存在截斷內容為0

#include <func.h>int main(int argc,char* argv[]) {ARGS_CHECK(argc,2);int fd;fd=open(argv[1],O_RDONLY|O_TRUNC,0600);ERROR_CHECK(fd,-1,"open");printf("fd=%d\n",fd);return 0; }

close用于文件的關閉:

int close(int fd);//fd表示文件描述詞,是先前由open或creat創建文件時的返回值。

文件使用完畢后,應該調用close關閉它,一旦調用close,則該進程對文件所加的鎖全都被釋放,并且使文件的打開引用計數減1,只有文件的打開引用計數變為0以后,文件才會被真正的關閉。


讀寫文件

函數原型:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);//文件描述詞 緩沖區 長度

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

對于read和write函數,出錯返回-1,讀取完了之后,返回0, 其他情況返回讀寫的個數

read.c

#include <func.h> int main(int argc, char* argv[]) {ARGS_CHECK(argc, 2);int fd;fd = open(argv[1], O_RDONLY);ERROR_CHECK(fd, -1, "open");printf("fd = %d\n", fd);int ret;ret = read(fd, buf, sizeof(buf));ERROR_CHECK(ret, -1, "read");printf("buf = %s\n", buf);return 0; }

write.c

#include <func.h>int main(int argc,char* argv[]) {ARGS_CHECK(argc,2);int fd;fd=open(argv[1],O_RDWR);ERROR_CHECK(fd,-1,"open");printf("fd = %d\n",fd);int arr[5]={1,2,3,4,5};int ret;ret=write(fd,arr,sizeof(arr));ERROR_CHECK(fd,-1,"write");lseek(fd,0,SEEK_SET); //從文件頭開始計算memset(arr,0,sizeof(arr));ret=read(fd,arr,sizeof(arr));ERROR_CHECK(fd,-1,"read");printf("ret = %d,arr[0] = %d,arr[3] = %d\n",ret,arr[0],arr[3]);return 0; }
文件定位

函數lseek將文件指針設定到相對于whence,偏移值為offset的位置

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

whence 可以是下面三個常量的一個
SEEK_SET 從文件頭開始計算
SEEK_CUR 從當前指針開始計算
SEEK_END 從文件尾開始計算

  • 文件空洞——通常用于多進程間通信的時候的共享內存
#include <func.h> int main(int argc,char* argv[]) {ARGS_CHECK(argc,2);int fd;fd=open(argv[1],O_RDWR);ERROR_CHECK(fd,-1,"open");printf("fd=%d\n",fd);int ret;ret=lseek(fd,1024,SEEK_SET);printf("lseek ret=%d\n",ret);char c='H';write(fd,&c,sizeof(c));close(fd);return 0; }

  • 改變文件大小
#include <func.h>int main(int argc,char* argv[]) {ARGS_CHECK(argc,2);int fd;fd=open(argv[1],O_RDWR);ERROR_CHECK(fd,-1,"open");printf("fd=%d\n",fd);int ret;ret=ftruncate(fd,1024);ERROR_CHECK(ret,-1,"ftruncate");close(fd);return 0; }
獲取文件信息

fstat和stat函數獲取文件信息,調用完畢后,文件信息被填充到結構體struct stat變量中,函數原型為:

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *file_name, struct stat *buf); //文件名 stat結構體指針

int fstat(int fd, struct stat *buf); //文件描述詞 stat結構體指針

stat結構體:

struct stat { dev_t st_dev; /* 如果是設備,返回設備表述符,否則為0 */ ino_t st_ino; /* i節點號 */ 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_size; /* 文件大小,字節表示 */ blksize_t st_blksize; /* 塊大小 */ blkcnt_t st_blocks; /* 塊數 */ time_t st_atime; /* 最后訪問時間 */ time_t st_mtime; /* 最后修改時間 */ time_t st_ctime; /* 最后權限修改時間 */ };

EXAMPLE:獲得文件的大小

  • 用stat實現
#include<sys/stat.h> #include<unistd.h> int main() {struct stat buf; stat (“/etc/passwd”,&buf);printf(“/etc/passwd file size = %d \n”,buf.st_size);//st_size可以得到文件大小}
  • 用fstat實現
int fd = open (“/etc/passwd”,O_RDONLY); //先獲得文件描述詞 fstat(fd, &buf); 實例: #include <func.h> int main() {int fd = open("/home/a.txt", O_RDONLY);if(fd == -1){perror("open error");exit(-1);}struct stat buf;int iRet = fstat(fd, &buf);if(iRet == -1){perror("fstat error");exit(-1);}printf("the size of file is : %d\n", buf.st_size);return 0; }

轉載于:https://www.cnblogs.com/Mered1th/p/10699085.html

總結

以上是生活随笔為你收集整理的Linux系统编程——基于文件描述符的文件操作(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。