簡體   English   中英

Linux-C程序

[英]Linux- C program

我最近(昨天)開始嘗試學習 linux 並在這個操作系統中編程。 現在,我在網上沖浪時遇到的一個有趣且可能很簡單的問題是這樣的:

考慮一個 C 程序,它將目錄作為命令行中的參數,並計算目錄樹中所有文件的維度總和。

現在,由於我在短時間內進行了大量閱讀和研究,我所有的知識都堆積在我的布賴恩中,造成了一片混亂。 如果有人可以幫助我編寫代碼,我將非常感激。

你問的是一項基本任務。 它可以在 linux 中完成,但如果您正在用 C 或 C++ 編寫程序,也可以在 microsoft windows 中完成,只需稍微調整代碼即可。 您將編寫代碼,與其他方式相比,這是在較低級別的代碼,以完成您想要的。

但是,您不需要編寫程序 C,然后需要您將其編譯為可執行文件。 因為您要問的是一項基本任務,所以您可以使用特定於 linux 的 bash shell 腳本來完成它。 如果您想在 Windows 中執行此操作,那么您將編寫一個 .bat 文件,該文件是 DOS 腳本語言或 Windows Powershell。 我對 Windows 不是很熟悉,我提到它只是為了幫助您對“所有知識堆積在您的大腦中造成的混亂”有一個大致的了解。

有在 Microsoft Windows 下運行的 windirstat 程序,可以從 sourceforge 獲得它,我認為它主要滿足您的要求。 我不確定您是否可以獲得它的源代碼。

對於 linux,有kdirstat ,您可以從http://kdirstat.cvs.sourceforge.net/viewvc/kdirstat/獲取源代碼,您可以將其下載為 GNU tarball。 看看那個程序是如何編寫的,它是 C++,因為你會看到一堆 .cpp 文件。 這將是一個很好的模板,您可以看到他們使用哪些庫來完成文件系統功能。 有21個.cpp文件,先看文件kdirstatmain.cpp 對於 C/C++ 代碼,執行的開始是函數int main(int argc, char *argv[])

關於在 linux 中使用 bash shell 腳本完成此任務,我能告訴您的最好方法是在 linux 的 bash shell 腳本上進行網絡搜索。

在 linux 中,要calculate the sum of all the files' dimensions that are in the directory's tree我們可以在 linux 提示符下使用du -sh .快速完成此操作du -sh . 命令。 在 linux 中,在提示符處執行man du以便閱讀有關磁盤使用命令的信息。 然后考慮尋找du的源代碼以將其用作模板,並研究他們如何實現 du 來學習,然后修改他們的方式以滿足您的需求。

linux du 命令源碼

使用opendir(3)來“打開”目錄。 由於您對學習如何在 GNU/Linux 中編程感興趣,請首先在終端中鍵入man opendir以了解該函數的工作原理。 opendir(3) (3)中的opendir(3)表示可以在聯機幫助頁的第 3 節中找到此函數的幫助。 請注意,在頁面頂部,聯機幫助頁會告訴您需要哪些#include

如果一切順利, opendir(3)將返回一個DIR*對象。 要知道它包含哪些文件或子目錄,您可以將此對象與readdir(3) 這應該返回一個struct dirent*類型的指針。 您可以查看有關此結構字段的詳細信息的手冊頁,但對您來說最重要的可能是d_typed_name 對該函數的第二次調用將返回下一個條目。 當它返回NULL ,這意味着您已讀取所有文件或發生錯誤。 要知道發生了什么,您應該檢查errno

這是一個簡短的示例,列出了/tmp中的所有條目:

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>

int main(void)
{
    DIR *dir;
    struct dirent *entry;

    dir = opendir("/tmp");
    /* should check if dir != NULL */

    while ((entry = readdir(dir)) != NULL) {
        printf("Found %s\n", entry->d_name);
    }
    /* You may want to check errno here to see if readdir returned
     * NULL because all files were read or because of some error;
     * but this is beyond the purposes of my example.
     */

    closedir(dir);

    return 0;
}

現在您必須處理每個條目。 如果它是一個目錄,您必須深入其中閱讀其內容。 遞歸函數可能會在這里幫助你。 如果它是一個文件,那么您至少有兩個選擇:

  1. 使用fopen(3)打開它,然后使用fseek(3)尋找文件的結尾。 使用fseek(3)的返回值來計算文件的大小(以字節為單位);
  2. 使用stat(2)獲取包含文件信息的結構。 不要將它與stat(1)混淆。 如果您只輸入man stat ,您將獲得有關后者的信息。 要強制man從第 2 節中讀取,請在命令行中鍵入man 2 stat

第一種方法當然更簡單。 第二個將要求您閱讀有關stat(2)工作原理的一些信息。 我的建議:你應該這樣做。 不僅因為它更多地屬於 Linux,還因為它提供了fseek(3)沒有提供的信息。 例如,您可以使用stat(2)不僅可以查看文件包含多少字節,還可以查看它在磁盤中占用的字節數(就像du一樣)。

在閱讀目錄時,您可能會偶然發現除文件和目錄之外的其他類型的條目。 stat(2)也可能會幫助您計算它們的大小。 但是您現在可能只想忽略它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM