Linux 下C程式設計(一)檔案基礎

2022-03-12 17:12:55 字數 3940 閱讀 1363

一.課程概要

1.檔案描述符

2.檔案操作和核心資料結構

3.檔案原子操作

二.正文

(一).檔案描述符

1.檔案描述符簡介

1).對於linux核心而言,所有的檔案開啟都是有檔案描述符引用的.

2).檔案描述符是乙個非負整數(返回-1為標準出錯),並且與檔案是相對應的.

3).當開啟乙個現存盤案或建立乙個新檔案時,核心向程序返回乙個檔案描述符.

4).當讀寫檔案時,需要(用open或creat返回值)將檔案描述符當做引數傳遞給相應的函式(read,write).

5).**實踐 gcc -o bin/fd_test src/fd_test.c

遇到問題:當(./bin/fd_test)執行**時,開啟檔案的失敗(返回值為-1),進入bin目錄執行fd_test時成功(返回值為3)?

6).返回值為什麼為3?

當程式執行時,系統會開啟3個檔案,標準輸入0(stdin_fileno),標準輸出1(stdout_fileno),標準出錯2(stderr_fileno),這些都定義在標頭檔案中.所以開啟的檔案是以3開始計數的.

7).檔案描述符的範圍時0~open_max.這個巨集值.很多系統時63,linux是1024.

(二),實現shell命令

1.自定義標頭檔案

1).編寫乙個具有的cp功能的自定義標頭檔案 io.h(傳入的為檔案描述符)

2) 路徑

include/io.h

src/io.c

3).編譯生成二進位制檔案

gcc -c -iinclude src/io.c

2.編寫mcp上層檔案

1).路徑

src/mcp.c

2).編譯

gcc -iinclude src/io.c src/mcp.c -o bin/mcp

3.編寫mcat上層檔案

1).路徑

src/mcat.c

2).編譯

gcc -iinclude src/io.c src/mcp.c -o bin/mcp

(三).檔案操作和核心資料結構

1.操作檔案i/o的五個函式

1).open

2).read

3).wirte

4).lseek

5).close

2.操作檔案描述符號的函式

1).dup

2).dup2

3.改變檔案狀態函式

1).fcntl

4.檔案在核心中的資料結構(有3種資料結構表示)

1).檔案描述符表

2).檔案表項

3).v節點

5.檔案原子操作

2.creat函式(建立檔案,預設為只寫方式開啟)

1).標頭檔案

#include

#include

#include

2).原型

int creat(const char *pathname, mode_t mode);

const char *pathname 為要開啟的檔案路徑

mode_t mode 檔案的許可權

返回值:成功返回檔案描述符,失敗返回-1.

3.close 函式(關閉檔案描述符)

1).標頭檔案

#include

2).原型

int close(int fd);

int fd 為檔案描述符

返回值:成功返回0,失敗返回-1.

當乙個程序中制定時,它開啟的所有檔案都有核心自動關閉.

4.read 函式(從檔案中讀內容)

1).標頭檔案

#include

2).原型

ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);

ssize_t read(int fildes, void *buf, size_t nbyte);

int fildes 檔案描述符

void *buf 快取區

size_t nbyte 需要讀資料到的位元組數

返回值:成功返回讀到的位元組數,若已讀到檔案尾部且檔案沒有內容,則為0,失敗返回-1.

3).有多種情況使讀到的位元組數少於要求讀的位元組數

(1).在讀普通檔案時,在讀到要求位元組數之前已到達檔案尾端.

(2).當從終端裝置讀時,通常最多讀一行.

(3).當從網路讀時,網路中的快取機構可能造成返回值小於所要求讀的位元組數.

(4).某些面向記錄的裝置,如磁帶,每次最多返回乙個記錄.

(5).程序由於訊號造成的中斷(正在讀的時候,程序終止).

5. write函式(向檔案中寫內容)

1).標頭檔案

#include

2).原型

ssize_t pwrite(int fildes, const void *buf, size_t nbyte,off_t offset);

ssize_t write(int fildes, const void *buf, size_t nbyte);

int fildes 檔案描述符

const void *buf, size_t nbyte 快取區

size_t nbyte 需要向檔案寫入的位元組數

返回值:成功返回已寫到的位元組數,失敗返回-1.

6.lseek 函式(改變讀寫檔案時讀寫指標位置)

1).標頭檔案

#include

#include

2).原型

off_t lseek(int fd, off_t offset, int whence);

int fd 檔案描述符

off_t offset 檔案偏移量

int whence 位置

若whence是seek_set,則將該檔案的位移量設定為距檔案開始處 offset 個位元組.

若whence是seek_cur,則將該檔案的位移量設定為當前值加 offset, offset可以為正或負.

若whence是seek_end,則將該檔案的位移量設定為檔案長度加 offset, offset可以為正或負.

8.dup和dup2(檔案描述符操作)

1).標頭檔案

#include

2).原型

int dup(int oldfd);

int dup2(int oldfd, int newfd);

用來複製檔案描述符,在程序通訊的時候,改變程序標準輸入和標準輸出裝置,

返回值:成功返回新的檔案描述符,失敗返回-1.

3).使用dup2從定向檔案標準輸入/輸出.

(1).編寫dup2_test.c

(1).路徑

src/dup2_test.c

(2).編譯

gcc -o bin/dup2_test src/dup2_test.c

9.fcntl(可以改變已經開啟檔案的性質.)

1).標頭檔案

#include

#include

#include

2).原型

int fcntl(int fd, int cmd, ... /* arg */ );

int fd 檔案描述符

int cmd 檔案狀態設定

返回值:成功(則依賴於cmd)返回乙個大於0的數,失敗返回-1.

3).編寫mcat上層檔案

(1).路徑

src/flag_test.c

(2).編譯

gcc -iinclude src/io.c src/flag_test.c -o bin/flag_test

(3)./bin/flag_test test.txt zhangjianqi!

linux基礎學習(一)檔案處理

一 檔案處理 建立檔案 touch file 複製檔案 cp file1 file2 cp file1 file2 file3 dir 前三個檔案複製到最後乙個資料夾中 移動檔案 mv f1 f2 mv f1 f2 f3 dir 刪除檔案 rm f1 rm f1 f2 f2 建立目錄 mkdir d...

linux基礎(一) 檔案與目錄

linux檔案目錄結構 1.根目錄下子目錄為一級目錄,一級目錄下還有二級目錄,以此呈樹狀結構,根目錄為樹根。2.fhs file systemhierarchy standard 檔案系統層次話標準,規定了linux系統中所有一級目錄和部分二級目錄 usr和 var 的用途。各目錄作用表 說明3.一...

Linux基礎(一) 檔案 使用者 許可權管理

1.檔案管理 2.使用者管理 3.許可權管理 整個根就是乙個倒樹裝的形態,目錄結構 這些都是根目錄,盡量不要動,在整個linux裡面,目錄也是檔案 2 常用指令 3 vim編輯器 複製貼上 查詢替換 剪下 視覺化模式ctrl v分屏模式ctrl w s v c sp 4 輸入輸出重定向 5 管道 管...