[英]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 來學習,然后修改他們的方式以滿足您的需求。
使用opendir(3)
來“打開”目錄。 由於您對學習如何在 GNU/Linux 中編程感興趣,請首先在終端中鍵入man opendir
以了解該函數的工作原理。 opendir(3)
(3)
中的opendir(3)
表示可以在聯機幫助頁的第 3 節中找到此函數的幫助。 請注意,在頁面頂部,聯機幫助頁會告訴您需要哪些#include
。
如果一切順利, opendir(3)
將返回一個DIR*
對象。 要知道它包含哪些文件或子目錄,您可以將此對象與readdir(3)
。 這應該返回一個struct dirent*
類型的指針。 您可以查看有關此結構字段的詳細信息的手冊頁,但對您來說最重要的可能是d_type
和d_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;
}
現在您必須處理每個條目。 如果它是一個目錄,您必須深入其中閱讀其內容。 遞歸函數可能會在這里幫助你。 如果它是一個文件,那么您至少有兩個選擇:
fopen(3)
打開它,然后使用fseek(3)
尋找文件的結尾。 使用fseek(3)
的返回值來計算文件的大小(以字節為單位);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.