0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux文件權(quán)限及Makefile

科技綠洲 ? 來(lái)源:Zhang丶&|! ? 作者:Zhang丶&|! ? 2023-11-24 16:06 ? 次閱讀

man 手冊(cè)

1.1 漢化

安裝中文包

sudo apt-get update
sudo apt-get install manpages-zh

1.2 具體使用

使用三種方式查詢open接口的詳細(xì)信息

//man -L zh_CN open
man 1 open
man 2 open
man 3 open

Part2文件權(quán)限

2.1 權(quán)限理解

在 Ubuntu(以及其他類(lèi) UNIX 操作系統(tǒng))中,文件權(quán)限用于控制誰(shuí)可以對(duì)文件進(jìn)行哪些操作。文件權(quán)限在權(quán)限位組合中表示為一組三位權(quán)限字符串。每個(gè)權(quán)限字符串表示了文件的所有者、組和其他用戶所具有的權(quán)限。 Ubuntu 文件權(quán)限的詳細(xì)說(shuō)明:

一個(gè)權(quán)限字符串由九個(gè)字符組成,這九個(gè)字符可以分成三組,每組三個(gè)字符:

  • 第一組 :文件類(lèi)型和所有者權(quán)限
  • 第二組 :組權(quán)限
  • 第三組 :其他用戶權(quán)限

每組中的三個(gè)字符分別表示讀?。╮)、寫(xiě)入(w)和執(zhí)行(x)權(quán)限。如果某個(gè)權(quán)限位被授予,相應(yīng)的字符為相應(yīng)的字母,如果未授予,則為減號(hào)(-)。

以下是一個(gè)權(quán)限字符串的示例:-rwxr--r--

這個(gè)權(quán)限字符串表示:

  • 文件類(lèi)型:普通文件(減號(hào)表示)
  • 所有者權(quán)限:讀、寫(xiě)、執(zhí)行
  • 組權(quán)限:讀
  • 其他用戶權(quán)限:讀

2.2 文件詳細(xì)信息查詢

可以用 ll 命令查看當(dāng)前文件夾下文件詳細(xì)信息

圖片
img

或者查看指定文件

zsd@Ubuntu:~/study/linuxStudy$  ls -l test.c
-rw-rw-r-- 1 zsd zsd 08月 2715:34 test.c

在上面的輸出中,-rw-r--r-- 就是文件的權(quán)限字符串。第一個(gè)字符 - 表示文件類(lèi)型(普通文件),d 表示隱藏文件,接下來(lái)的三個(gè)字符是所有者權(quán)限,再后面的三個(gè)字符是組權(quán)限,最后的三個(gè)字符是其他用戶權(quán)限。

2.3 權(quán)限更改

要更改文件權(quán)限,可以使用 chmod 命令。例如,要將文件 "test.c" 的所有者權(quán)限設(shè)置為讀、寫(xiě)、執(zhí)行,可以執(zhí)行以下命令:

chmod 700 test.c

這會(huì)將權(quán)限字符串修改為 -rwx------,表示所有者擁有全部權(quán)限,其他用戶沒(méi)有任何權(quán)限。

圖片

圖片

Part3****常用函數(shù)接口

3.1 open

open 函數(shù)是一個(gè)系統(tǒng)調(diào)用,用于打開(kāi)一個(gè)文件或者創(chuàng)建一個(gè)新文件,并返回一個(gè)文件描述符(file descriptor),以便后續(xù)對(duì)文件的讀寫(xiě)操作。它是在 頭文件中聲明的,其函數(shù)原型如下:

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

3.1.1open 函數(shù)的參數(shù)和作用

  • pathname(文件路徑) :這是一個(gè)字符串,表示要打開(kāi)或創(chuàng)建的文件的路徑??梢允窍鄬?duì)路徑或絕對(duì)路徑。
  • flags(標(biāo)志位) :這是一個(gè)整數(shù),用于指定打開(kāi)文件的方式和選項(xiàng)。常見(jiàn)的標(biāo)志位包括:
    這些標(biāo)志位可以通過(guò)按位或(|)組合使用,以滿足特定的需求。例如,O_RDONLY | O_CREAT 表示以只讀方式打開(kāi)文件,如果文件不存在則創(chuàng)建。
    • O_RDONLY:只讀打開(kāi)。
    • O_WRONLY:只寫(xiě)打開(kāi)。
    • O_RDWR:讀寫(xiě)打開(kāi)。
    • O_CREAT:如果文件不存在,創(chuàng)建文件。
    • O_TRUNC:如果文件存在,截?cái)辔募▽⑽募笮≈脼?)。
    • O_APPEND:在文件末尾追加寫(xiě)入。
  • mode(文件權(quán)限) :這是一個(gè)整數(shù),僅在創(chuàng)建文件時(shí)使用。它指定了新創(chuàng)建文件的權(quán)限(文件所有者、組和其他用戶的讀寫(xiě)執(zhí)行權(quán)限)。通常使用八進(jìn)制表示,如 0644 表示所有者可讀寫(xiě),其他用戶只讀。

3.1.2 函數(shù)返回值

open 函數(shù)的返回值是一個(gè)整數(shù),表示文件描述符。如果成功打開(kāi)或創(chuàng)建文件,返回的文件描述符是一個(gè)非負(fù)整數(shù)。如果出現(xiàn)錯(cuò)誤,返回值為 -1,并可以使用 errno 來(lái)獲取具體的錯(cuò)誤代碼。

3.2 read

read 函數(shù)是一個(gè)系統(tǒng)調(diào)用,用于從文件描述符(file descriptor)中讀取數(shù)據(jù)。它是在 頭文件中聲明的,其函數(shù)原型如下:

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

3.2.1 read 函數(shù)的參數(shù)和作用

  • fd(文件描述符) :這是一個(gè)整數(shù)值,表示要從哪個(gè)文件描述符讀取數(shù)據(jù)。文件描述符是一個(gè)用于標(biāo)識(shí)打開(kāi)的文件、套接字等的整數(shù)值。在代碼中,使用了 open 函數(shù)來(lái)打開(kāi)文件,并將返回的文件描述符傳遞給了 read 函數(shù)。
  • buf(緩沖區(qū)) :這是一個(gè)指向存儲(chǔ)讀取數(shù)據(jù)的內(nèi)存緩沖區(qū)的指針。read 函數(shù)會(huì)將讀取的數(shù)據(jù)存儲(chǔ)到這個(gè)緩沖區(qū)中。
  • count(讀取字節(jié)數(shù)) :這是要讀取的最大字節(jié)數(shù)。read 函數(shù)會(huì)嘗試從文件中讀取最多 count 字節(jié)的數(shù)據(jù)。

3.2.2 函數(shù)返回值

read 函數(shù)的返回值是一個(gè) ssize_t 類(lèi)型的整數(shù),表示實(shí)際讀取的字節(jié)數(shù)。返回值可以是以下幾種情況之一:

  • 如果返回值為正數(shù):表示成功讀取了指定數(shù)量的字節(jié)。
  • 如果返回值為 0:表示已經(jīng)到達(dá)文件末尾(End of File,EOF)。
  • 如果返回值為 -1:表示出現(xiàn)了錯(cuò)誤。可以通過(guò)檢查 errno 來(lái)獲取具體的錯(cuò)誤代碼。

3.3 write

write 函數(shù)是一個(gè)系統(tǒng)調(diào)用,用于向文件描述符(file descriptor)寫(xiě)入數(shù)據(jù)。它是在 頭文件中聲明的,其函數(shù)原型如下:

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

3.3.1 write` 函數(shù)的參數(shù)和作用

  • fd(文件描述符) :這是一個(gè)整數(shù)值,表示要向哪個(gè)文件描述符寫(xiě)入數(shù)據(jù)。文件描述符是一個(gè)用于標(biāo)識(shí)打開(kāi)的文件、套接字等的整數(shù)值。在代碼中,你使用了 open 函數(shù)來(lái)打開(kāi)文件,并將返回的文件描述符傳遞給了 write 函數(shù)。
  • buf(緩沖區(qū)) :這是一個(gè)指向包含要寫(xiě)入數(shù)據(jù)的內(nèi)存緩沖區(qū)的指針。write 函數(shù)會(huì)將緩沖區(qū)中的數(shù)據(jù)寫(xiě)入到文件中。
  • count(寫(xiě)入字節(jié)數(shù)) :這是要寫(xiě)入的字節(jié)數(shù)。write 函數(shù)會(huì)嘗試將緩沖區(qū)中的前 count 字節(jié)的數(shù)據(jù)寫(xiě)入到文件中。

3.3.2 函數(shù)返回值

write 函數(shù)的返回值是一個(gè) ssize_t 類(lèi)型的整數(shù),表示實(shí)際寫(xiě)入的字節(jié)數(shù)。返回值可以是以下幾種情況之一:

  • 如果返回值為非負(fù)數(shù):表示成功寫(xiě)入了指定數(shù)量的字節(jié)。
  • 如果返回值為 -1:表示出現(xiàn)了錯(cuò)誤??梢酝ㄟ^(guò)檢查 errno 來(lái)獲取具體的錯(cuò)誤代碼。

3.4 close

close 函數(shù)是一個(gè)系統(tǒng)調(diào)用,用于關(guān)閉文件描述符(file descriptor)。它是在 頭文件中聲明的,其函數(shù)原型如下:

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

3.4.1 close` 函數(shù)的解析

  • fd(文件描述符) :這是一個(gè)整數(shù)值,表示要關(guān)閉的文件描述符。文件描述符是一個(gè)用于標(biāo)識(shí)打開(kāi)的文件、套接字等的整數(shù)值。在代碼中,你可能使用了 open 函數(shù)來(lái)打開(kāi)文件,并將返回的文件描述符傳遞給了 close 函數(shù)。

3.4.2 函數(shù)返回值

close 函數(shù)的返回值是一個(gè)整數(shù)。如果關(guān)閉文件成功,返回值為 0。如果出現(xiàn)錯(cuò)誤,返回值為 -1,并可以通過(guò)檢查 errno 來(lái)獲取具體的錯(cuò)誤代碼。

3.5 函數(shù)使用示例

#include < fcntl.h >   // 包含文件操作相關(guān)的頭文件
#include < unistd.h >  // 包含系統(tǒng)調(diào)用相關(guān)的頭文件
#include < stdio.h >   // 包含標(biāo)準(zhǔn)輸入輸出庫(kù),用于使用 perror 函數(shù)

int main() {
    // 打開(kāi)源文件,只讀方式
    int src_fd = open("source.txt", O_RDONLY);
    if (src_fd == -1) {
        perror("Error opening source file");
        return1;
    }

    // 打開(kāi)目標(biāo)文件,寫(xiě)入方式(如果不存在則創(chuàng)建)
    int dest_fd = open("destination.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (dest_fd == -1) {
        perror("Error opening destination file");
        close(src_fd);  // 關(guān)閉源文件
        return1;
    }

    // 讀取源文件數(shù)據(jù)并寫(xiě)入目標(biāo)文件
    char buffer[1024];
    ssize_t bytes_read;

    while ((bytes_read = read(src_fd, buffer, sizeof(buffer))) > 0) {
        ssize_t bytes_written = write(dest_fd, buffer, bytes_read);
        if (bytes_written == -1) {
            perror("Error writing to destination file");
            close(src_fd);   // 關(guān)閉源文件
            close(dest_fd);  // 關(guān)閉目標(biāo)文件
            return1;
        }
    }

    // 檢查讀取過(guò)程中是否出錯(cuò)
    if (bytes_read == -1) {
        perror("Error reading from source file");
        close(src_fd);   // 關(guān)閉源文件
        close(dest_fd);  // 關(guān)閉目標(biāo)文件
        return1;
    }

    // 關(guān)閉文件
    if (close(src_fd) == -1) {
        perror("Error closing source file");
        return1;
    }

    if (close(dest_fd) == -1) {
        perror("Error closing destination file");
        return1;
    }

    printf("File copy successful.n");

    return0;
}

Part4make與Makefile

4.1 make 與 Makefile區(qū)別

makemake 是一個(gè)命令行工具,用于自動(dòng)化構(gòu)建軟件項(xiàng)目。它根據(jù)一組規(guī)則和依賴關(guān)系,檢查源代碼文件的最新修改日期,并確定哪些文件需要重新編譯。make 在 Linux 和類(lèi) UNIX 系統(tǒng)上廣泛使用,以減少手動(dòng)編譯的工作量。

MakefileMakefile 是一個(gè)文本文件,其中包含了用于構(gòu)建軟件項(xiàng)目的規(guī)則、依賴關(guān)系和命令。它告訴 make 工具如何編譯和鏈接源代碼文件,以及在構(gòu)建過(guò)程中需要執(zhí)行哪些操作。Makefile 通常包括目標(biāo)(target)、依賴關(guān)系(dependencies)和要執(zhí)行的命令。

4.2 Makefile的編寫(xiě)

# 編譯器
# CC = g++
CC = gcc

# 編譯選項(xiàng)
# CFLAGS = -Wall -std=c++11
# CFLAGS = -Wall -std=c++11 -g
# CFLAGS = -Wall -std=c++11 -static
CFLAGS = -Wall

# 目標(biāo)文件名
TARGET = myprogram

# 所有的源代碼文件
SOURCES = main.c utils.c mytest.c

# 生成目標(biāo)文件的中間文件
OBJECTS = $(SOURCES:.c=.o)

# 默認(rèn)目標(biāo)
all: $(TARGET)

# 生成目標(biāo)文件
$(TARGET): $(OBJECTS)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS)

# 編譯每個(gè)源文件到目標(biāo)文件
%.o: %.c
	$(CC) $(CFLAGS) -c $  -o $@

# 調(diào)試目標(biāo)
# debug: $(TARGET)
	# gdb ./$(TARGET)

# 清理生成的文件
clean:
	rm -f $(OBJECTS) $(TARGET)

Part5vim簡(jiǎn)單操作

輸入:help查看幫助,按下Ctrl + w 然后按下 q 退出幫助

  1. 啟動(dòng) Vim :在終端中輸入 vim 命令,后跟文件名,即可啟動(dòng) Vim 并打開(kāi)指定文件:
  2. 模態(tài)編輯 :Vim 有多種模式,其中兩個(gè)主要模式是:
    • 正常模式(Normal Mode) :用于導(dǎo)航、刪除、復(fù)制等操作。
    • 插入模式(Insert Mode) :用于輸入文本。
  3. 切換模式
    • 進(jìn)入正常模式:按下 Esc 鍵。
    • 進(jìn)入插入模式:在正常模式下按下 i 鍵(在光標(biāo)前插入)、a 鍵(在光標(biāo)后插入)或其他命令(如 oO)。
  4. 保存和退出
    • 保存文件:在正常模式下按下 : 鍵,然后輸入 w 并按下 Enter 鍵。
    • 保存并退出:在正常模式下按下 : 鍵,然后輸入 wq 并按下 Enter 鍵。
    • 退出不保存:在正常模式下按下 : 鍵,然后輸入 q! 并按下 Enter 鍵。
  5. 基本移動(dòng)
    • 上移:k
    • 下移:j
    • 左移:h
    • 右移:l
  6. 刪除和復(fù)制
    • 刪除字符:在正常模式下按下 x 鍵。
    • 復(fù)制行:在正常模式下按下 yy
  7. 撤銷(xiāo)和重做
    • 撤銷(xiāo):在正常模式下按下 u 鍵。
    • 重做:在正常模式下按下 Ctrl + r 鍵。
  8. 查找和替換
    • 查找:在正常模式下按下 / 鍵,然后輸入要查找的內(nèi)容并按下 Enter 鍵。
    • 替換:在正常模式下按下 : 鍵,然后輸入 %s/old/new/g 進(jìn)行全局替換。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8447

    瀏覽量

    150722
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208721
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    561

    瀏覽量

    24671
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    575

    瀏覽量

    20470
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19158
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Makefile】C文件包含的頭文件修改,但不重新編譯?

    Linux + MakefileMakefile的高階用法:解決C文件包含的頭文件修改了,但C文件
    的頭像 發(fā)表于 09-08 08:53 ?5188次閱讀
    【<b class='flag-5'>Makefile</b>】C<b class='flag-5'>文件</b>包含的頭<b class='flag-5'>文件</b>修改,但不重新編譯?

    嵌入式Linux入門(mén)(二、Linux文件系統(tǒng)、文件類(lèi)型及權(quán)限管理)

    嵌入式 Linux入 門(mén)第二課, linux 文件系統(tǒng)、文件類(lèi)型及權(quán)限管理。 ...... 矜辰所致
    的頭像 發(fā)表于 06-20 11:44 ?1957次閱讀
    嵌入式<b class='flag-5'>Linux</b>入門(mén)(二、<b class='flag-5'>Linux</b><b class='flag-5'>文件</b>系統(tǒng)、<b class='flag-5'>文件</b>類(lèi)型及<b class='flag-5'>權(quán)限</b>管理)

    淺談Linux內(nèi)核源碼的Makefile、Kconfig和.config文件

    Linux內(nèi)核源碼文件繁多,搞不清Makefile、Kconfig、.config間的關(guān)系,不了解內(nèi)核編譯體系,編譯修改內(nèi)核有問(wèn)題無(wú)從下手,自己寫(xiě)的驅(qū)動(dòng)不知道怎么編進(jìn)內(nèi)核,不知道怎么配置內(nèi)核,這些
    發(fā)表于 10-17 16:19 ?3668次閱讀
    淺談<b class='flag-5'>Linux</b>內(nèi)核源碼的<b class='flag-5'>Makefile</b>、Kconfig和.config<b class='flag-5'>文件</b>

    LINUX修改文件權(quán)限

    本帖最后由 Stark揚(yáng) 于 2018-9-28 16:56 編輯 用戶權(quán)限在Windows操作系統(tǒng)里也不陌生,但是Linux操作系統(tǒng)的用戶權(quán)限文件
    發(fā)表于 09-26 13:58

    Linux文件權(quán)限管理的探討

    Linux 是一種多用戶的操作系統(tǒng),其文件權(quán)限管理在文件管理中占有重要的地位。為了更好地把握Linux
    發(fā)表于 06-11 09:37 ?11次下載

    Linux改變文件或目錄的訪問(wèn)權(quán)限命令

    Linux改變文件或目錄的訪問(wèn)權(quán)限命令 Linux改變文件或目錄的訪問(wèn)權(quán)限命令  
    發(fā)表于 01-18 12:46 ?1195次閱讀

    Linux內(nèi)核Makefile文件

    Makefile文件的詳細(xì)編寫(xiě)過(guò)程
    發(fā)表于 08-28 09:25 ?14次下載

    Linux系統(tǒng)文件權(quán)限細(xì)節(jié)分析

    linux是一個(gè)安全的操作系統(tǒng),她是以文件為基礎(chǔ)而設(shè)計(jì)的,其文件權(quán)限是比較復(fù)雜的,可以用stat命令以及l(fā)sattr命令來(lái)顯示某個(gè)文件的詳細(xì)
    發(fā)表于 11-07 11:08 ?9次下載

    淺談Linux權(quán)限管理的ACL權(quán)限

    Linux權(quán)限管理是Linux很重要的一項(xiàng)內(nèi)容,重則引起用戶信息泄露,輕則導(dǎo)致文件錯(cuò)亂和丟失。企業(yè)服務(wù)器里有些目錄下面的東西暫時(shí)保密,不希望別人可以進(jìn)入目錄并查看。有些
    的頭像 發(fā)表于 08-18 11:13 ?8928次閱讀

    Linux進(jìn)程權(quán)限的分析說(shuō)明

     在linux下,關(guān)于文件權(quán)限,大部分人接觸比較多,也比較熟悉了解。但是對(duì)進(jìn)程權(quán)限一般知之甚少。本文總結(jié)一下linux系統(tǒng)下進(jìn)程
    發(fā)表于 07-17 10:55 ?853次閱讀

    Linux內(nèi)核的Makefile、Kconfig和.config文件

    Linux內(nèi)核源碼文件繁多,搞不清Makefile、Kconfig、.config間的關(guān)系,不了解內(nèi)核編譯體系,編譯修改內(nèi)核有問(wèn)題無(wú)從下手,自己寫(xiě)的驅(qū)動(dòng)不知道怎么編進(jìn)內(nèi)核,不知道怎么配置內(nèi)核,這些
    的頭像 發(fā)表于 11-12 17:31 ?2991次閱讀

    linux修改文件權(quán)限

    我們首先使用`ls -l`指令查看文件權(quán)限信息(以/etc/fstab為例)。
    的頭像 發(fā)表于 01-11 10:45 ?1004次閱讀

    Linux系統(tǒng)如何修改文件屬性與權(quán)限

    我們已經(jīng)深入學(xué)習(xí)了Linux系統(tǒng)中用戶和用戶組的基本概念。每個(gè)文件和目錄都具有“所屬用戶”和“所屬用戶組”這兩個(gè)屬性,這兩個(gè)屬性對(duì)文件權(quán)限及安全性至關(guān)重要。本節(jié)我們就來(lái)學(xué)習(xí)如何修改一個(gè)
    的頭像 發(fā)表于 05-12 15:29 ?2559次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)如何修改<b class='flag-5'>文件</b>屬性與<b class='flag-5'>權(quán)限</b>

    Linux 下的make 工具和 Makefile

    文件結(jié)構(gòu)) 嵌入式 Linux 入門(mén)(二、Linux 文件系統(tǒng)、文件類(lèi)型及權(quán)限管理 嵌入式
    的頭像 發(fā)表于 06-22 10:45 ?1026次閱讀
    <b class='flag-5'>Linux</b> 下的make 工具和 <b class='flag-5'>Makefile</b>

    linux文件訪問(wèn)權(quán)限怎么設(shè)置

    Linux 文件訪問(wèn)權(quán)限是操作系統(tǒng)中一個(gè)非常重要的概念。正確地設(shè)置文件訪問(wèn)權(quán)限可以保護(hù)系統(tǒng)的安全性,防止未經(jīng)授權(quán)的人員對(duì)
    的頭像 發(fā)表于 11-23 10:20 ?1415次閱讀