」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 潛入系統編程:C的初學者指南

潛入系統編程:C的初學者指南

發佈於2025-02-06
瀏覽:739

Dive into Systems Programming: A Beginner\'s Guide to C

探索系統編程:C 語言初學者指南

系統編程涉及與計算機底層硬件和軟件交互。 C 語言是系統編程的首選語言之一,因為它能夠直接訪問硬件資源。這篇指南將帶你踏上系統編程之旅,從 C 語言基礎到實際應用案例。

C 語言基礎

變量和數據類型:
變量用於存儲數據。在C 中,變量必須聲明其數據類型,例如:

int age; // 声明一个整型变量 "age"

函數:
函數是執行特定任務的可重用代碼塊。 C 函數的語法如下:

int add(int x, int y) {
  return x   y;
}

指針:
指針變量指向其他變量的內存地址。它們用於動態管理內存。

int num = 3;
int *ptr = # // ptr 指向变量 num 的地址

系統編程概念

內存管理:
系統編程涉及內存的直接管理。你需要知道如何分配和釋放內存空間。

// 分配 sizeof(int) 字节的内存
int *p = malloc(sizeof(int));

// 释放内存
free(p);

文件 I/O:
文件 I/O 操作對於系統編程至關重要。可以使用 fopen()fread()fwrite() 函數來操作文件。

// 打开 "test.txt" 文件
FILE *file = fopen("test.txt", "r");

// 读取文件内容
char buffer[1024];
fread(buffer, 1, 1024, file);

// 关闭文件
fclose(file);

操作系統交互:
C 語言提供了與操作系統交互的系統調用。這些調用允許程序執行特定任務,例如創建或終止進程。

// 创建一个子进程
pid_t pid = fork();

實戰案例:創建一個簡單的 shell

創建一個簡單的 shell 是展示系統編程實際應用的絕佳示例。以下是步驟:

  1. 初始化變量:包括標準輸入、輸出和錯誤流。
  2. 讀取用戶輸入:使用 fgets() 函數。
  3. 解析命令:將命令字符串分割成單詞和參數。
  4. 執行命令:使用 execv() 函數。
  5. 錯誤處理:處理命令執行錯誤。

完整的代碼如下:

#include 
#include 
#include 
#include 

int main() {
  char input[1024]; // 存储用户输入
  char *words[512]; // 存储命令和参数
  pid_t pid; // 子进程 ID

  while (1) {
    // 读取用户输入
    printf("> ");
    fgets(input, 1024, stdin);

    // 解析命令
    int num_words = tokenize(input, words);

    // 执行命令
    pid = fork();
    if (pid == 0) {
      // 子进程
      execv(words[0], words);
      perror("execv failed");
      exit(1);
    } else if (pid > 0) {
      // 父进程
      waitpid(pid, NULL, WUNTRACED);
    } else {
      // fork 失败
      perror("fork failed");
    }
  }

  return 0;
}
最新教學 更多>
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。 To resolve this issue and ensure scripts execute on subsequent page visits, Firefox...
    程式設計 發佈於2025-02-07
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    克服go mod中的模塊路徑差異 coreos/bbolt:github.com/coreos/ [email受保護]:解析go.mod:模塊將其路徑聲明為:go.etcd.io/bbolt `要解決此問題,您可以在go.mod文件中使用替換指令。只需在go.mod的末尾添加以下行:[&& &...
    程式設計 發佈於2025-02-07
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    </main> <section> ,但无法使其正常工作,如您所见。任何洞察力都将不胜感激! display:grid; { position:sticky; top:1em; z-index:1 1 ; { { { pos...
    程式設計 發佈於2025-02-07
  • Trie簡介(前綴樹)
    Trie簡介(前綴樹)
    Trie 是一種類似樹的數據結構,用於有效存儲和搜索字符串,尤其是在諸如AutoComplete,Spell Checking和IP路由之類的應用程序中。 Trie的關鍵特性: nodes :每個節點代表一個字符。 :root節點是空的,並用作起點。 :每個節點最多有26個...
    程式設計 發佈於2025-02-07
  • 如何處理PHP MySQL中的分頁和隨機訂購以避免重複和不一致?
    如何處理PHP MySQL中的分頁和隨機訂購以避免重複和不一致?
    [ php mysql分頁與隨機訂購:克服重複和頁面一致性挑戰 1。在後續頁面上排除先前看到的結果,以防止先前顯示的結果在隨機訂購時重新出現在隨機訂購時:在會話變量中存儲ID作為逗號分隔的列表。 修改您的sql查詢以排除這些IDS: 2。確保第一頁上的不同結果隨機訂購將使很難在第一頁上保證獨特的...
    程式設計 發佈於2025-02-07
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php 您的目標可能是檢索“ varnum”屬性值,其中提取數據的傳統方法可能會使您感到困惑。 - > attributes()為$ attributeName => $ attributeValue){ echo $ attributeName,'=“',$ a...
    程式設計 發佈於2025-02-07
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python 射線tracing方法Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a路徑對象表示多邊形。它檢查給定點是否位於定義路徑內。 T...
    程式設計 發佈於2025-02-07
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    [2明確擔心Microsoft Visual C(MSVC)在正確實現兩相模板實例化方面努力努力。該機制的哪些具體方面無法按預期運行? 背景:說明:的初始Syntax檢查在範圍中受到限制。它未能檢查是否存在聲明名稱的存在,導致名稱缺乏正確的聲明時會導致編譯問題。 為了說明這一點,請考慮以下示例:一個...
    程式設計 發佈於2025-02-07
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在默認值中使用current_timestamp或mysql版本中的current_timestamp或在5.6.5 這種限制源於遺產實現的關注,這些限制需要為Current_timestamp功能提供特定的實現。消息和相關問題 `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-02-07
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    使用(1)而不是(;;)會導致無限循環的性能差異? 現代編譯器,(1)和(;;)之間沒有性能差異。 是如何實現這些循環的技術分析在編譯器中: perl: S-> 7 8 unstack v-> 4 -e語法ok 在GCC中,兩者都循環到相同的彙編代碼中,如下所示:。 globl t_時 ...
    程式設計 發佈於2025-02-07
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令arr = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-02-07
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決“一般錯誤:2006 MySQL 服務器已消失”介紹:將數據插入MySQL 數據庫有時會導致錯誤“一般錯誤:2006 MySQL 服務器已消失”。當與服務器的連接丟失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變量之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2025-02-07
  • 在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在hibernate中保存枚舉值:故障排除錯誤的列type ,他們各自的映射至關重要。在Java中使用枚舉類型時,至關重要的是,建立冬眠的方式如何映射到基礎數據庫。 在您的情況下,您已將MySQL列定義為枚舉,並在Java中創建了相應的枚舉代碼。但是,您遇到以下錯誤:“ MyApp中的錯誤列類型...
    程式設計 發佈於2025-02-07
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript 理解prefix keys primary鍵(movie_id(3))primary鍵(Movie_id) primary鍵(Movie_id) primary鍵(Movie_id) > `這將在整個Movie_ID列上建立標...
    程式設計 發佈於2025-02-07
  • 如何在網站中連接兩個頁面
    如何在網站中連接兩個頁面
    在本指南中,您將學習如何使用基本HTML在網站上鍊接兩個頁面。鏈接頁面允許用戶輕鬆地在網站的不同部分之間導航。讓我們開始吧! 創建兩個HTML文件 首先,創建要鏈接的兩個HTML文件。例如,讓我們創建一個稱為index.html(您的主頁)和另一個稱為.html(您的關於頁面)的名為index....
    程式設計 發佈於2025-02-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3