【正點原子】Linux應用編程入門~概念及環境介紹

在這里插入圖片描述

應用編程概念

應用編程(也可稱為系統編程)與驅動編程、裸機編程有何不同?

  • 系統調用;

  • 何為庫函數;

  • 應用程序的 main()函數;

  • 應用程序開發環境的介紹;

系統調用
定義
  • 系統調用(system call)是 Linux 內核給應用層的應用編程接口(API),是 Linux 應用層到內核的入口;

  • 系統調用是內核直接向應用層提供的應用編程接口,譬如 open、write、read、close 等

功能

通過系統調用,通過系統調用 API,應用層可以實現與內核的交互;

Linux 應用程序可以請求內核以自己的名義執行某些事情,譬如打開磁盤中的文件、讀寫文件、關閉文件以及控制其它硬件外設;

在這里插入圖片描述

  • 操作系統下有兩種不同的狀態:內核態和用戶態

  • 應用程序運行在用戶態、而內核則運行在內核態。

應用編程與裸機編程、驅動編程區別

裸機編程:無操作系統支持的編程環境稱為裸機編程環境,例:單片機編程開發,直接在硬件運行程序,無操作系統支持;

Linux 驅動編程:是基于內核驅動框架開發驅動程序,驅動開發工程師通過調用 Linux 內核提供的接口完成設備驅動的注冊,驅動程序負責底層硬件操作相關邏輯;

Linux 應用編程(系統編程):基于 Linux 操作系統的應用編程,在應用程序中通過調用系統調用 API 完成應用程序的功能和邏輯,應用程序運行于操作系統之上;

總結
  • LED 應用程序與 LED 驅動程序是分隔、分離的,它們單獨編譯,它們并不是整合在一起的;

  • 應用程序運行在操作系統之上,有操作系統支持,應用程序處于用戶態,而驅動程序處于內核態,與純粹的裸機程序存在著質的區別;

  • Linux 應用開發與驅動開發是兩個不同的方向;

庫函數

分辨調用的函數是系統調用還是庫函數即可

發展歷程
  • 系統調用使用起來并不是很方便,提供比底層系統調用更為方便、更為好用、且更具有可移植性的調用接口;

  • C 庫是應用層使用的一套函數庫,Linux 下,常以動態(.so)庫文件的形式提供,存放在根文件系統/lib 目錄;

  • C 語言庫函數構建于系統調用之上,庫函數絕大部分由系統調用封裝而來;

庫函數和系統調用區別
  • 編寫應用程序除使用系統調用API接口,如 open、write、read、close之外,還使用庫函數(C語言庫函數);

  • 有些庫函數不調用任何系統調用,譬如一些字符串處理函數 strlen()、strcat()、memcpy()、memset();

  • 有些庫函數則會使用系統調用來完成實際操作,譬如庫函數 fopen 內部調用了系統調用 open()來幫它打開文件、庫函數 fread()利用系統調用 read()來完成讀文件操作、fwrite()就利用了系統調用 write()來完成寫文件操作;

在這里插入圖片描述

實現者的角度來看,系統調用與庫函數之間有根本的區別;

在實際應用編程中,直接把它們當做是 C 函數即可,知道調用的函數是系統調用還是庫函數即可

標準 C 語言函數庫

Linux系統使用的C語言庫為GNU C 語言函數庫,作為標準 C 語言函數庫;

( 也 叫 作 glibc , 其 網 址 為http://www.gnu.org/software/libc/)

glibc 版本

在這里插入圖片描述

main 函數

Linux 應用程序中,main 函數也是作為應用程序的入口函數存在,main 函數的形參一般會有兩種寫法

//示例代碼 1.4.1 main 函數寫法之無傳參
int main(void)
{/* 代碼 */
}
//示例代碼 1.4.2 main 函數寫法之有傳參
int main(int argc, char **argv)
{/* 代碼 */
}

argc 形參表示傳入參數的個數,包括應用程序自身路徑和程序名;

例:運行當前目錄下的 hello 可執行文件,并且傳入參數,如下所示:
./hello 112233
那么此時參數個數為 2,并且這些參數都是作為字符串的形式傳遞給 main 函數:
argv[0]等于"./hello"
argv[1]等于"112233"
有傳參時 main 函數的寫法并不只有這一種
開發環境推薦

我們的重點是學習應用編程!而不是學習 IDE 怎么用

Eclipse

vscode+ARM gcc(交叉編譯工具)

個人:nodepid++、gcc

剛剛下了vscode,很煩這個弄幾次了前期配置,之前也是;

c文件運行到底具體咋整好麻煩,幸好只是當編輯工具,后期再學一學吧;

我記得我成功過,好像改兩個地方就行(前提是插件裝好);

在這里插入圖片描述

入門篇

Makefile

提高篇
進階篇

cmake+vscode

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98013.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一、HTML 完全指南:從零開始構建網頁

文章目錄前言一、 HTML 結構認識 HTML 標簽HTML 文件基本結構標簽層次結構快速生成代碼框架二、 HTML 常見標簽詳解2.1 注釋標簽2.2 標題標簽 (h1 - h6)2.3 段落標簽 (p)2.4 換行標簽 (br)2.5 格式化標簽2.6 圖片標簽 (img)2.7 超鏈接標簽 (a)2.8 表格標簽基本使用合并單元格2.…

基于POI-TL實現動態Word模板的數據填充:【散點圖】特殊處理方案

基于POI-TL實現動態Word模板的數據填充:散點圖特殊處理方案 在使用POI-TL進行Word模板動態數據填充時,圖表生成是一個常見需求。最近在項目中使用POI-TL處理散點圖時遇到了一個特殊問題,經過研究后找到了解決方案,特此記錄分享。 問題背景 POI-TL作為一款優秀的Java Wor…

使用node-Express框架寫一個學校宿舍管理系統練習項目-前后端分離

今天繼續分享一個新的練習項目,是使用node做為后端語言,來寫的一個前后端分離項目:學校宿舍管理系統。我們如果想掌握一門編程語言,就是需要大量的練習。所以當我們學習到了一些知識,自己想一下 可以拿學到的知識&…

Kafka 運維實戰基本操作含命令與最佳實踐

1. 基礎概覽與工具入口 Kafka 發行包的所有 CLI 工具均在 bin/ 目錄下。任何工具不帶參數運行都會顯示所有可用選項。本文命令默認:--bootstrap-server localhost:9092;生產請替換為你的控制面或內網 VIP。 2. 主題管理(創建 / 修改 / 刪除 /…

貪心算法應用:航班起降問題詳解

Java中的貪心算法應用:航班起降問題詳解 貪心算法是一種在每一步選擇中都采取當前狀態下最優的選擇,從而希望導致全局最優解的算法策略。在航班起降問題中,貪心算法可以有效地解決機場跑道調度問題,即如何安排航班的起降順序以最大…

uniapp scroll-view 設置scrollTop無效

當我們使用 scroll-view的scroll-top的時候 默認想讓它回到頂部,當我們設置值為0的時候會不生效,在實際運用過程中,發現設置了scroll-top無效,滾動條位置并沒有發生變化,是因為微信小程序的官方框架處于性能考慮&#…

網絡與通信

1.TCP協議與UDP協議TCP(Transmission Control Protocol,傳輸控制協議)和 UDP(User Datagram Protocol,用戶數據報協議)是 TCP/IP 協議族中兩種核心的傳輸層協議,它們在數據傳輸方式、可靠性、適…

Node.js中package.json詳解

1. name(名稱) 如果你計劃發布你的包,package.json 中最重要的字段是 name 和 version,因為它們是必需的。name 和 version 共同組成一個假定完全唯一的標識符。包的更改應伴隨版本號的更新。如果你不打算發布包,那么…

代碼隨想錄第14天| 翻轉、對稱與深度

226.翻轉二叉樹 (優先掌握遞歸) 題目鏈接/文章講解/視頻講解:翻轉二叉樹 交換的是指針,而不是數值,如果用數值做交換,需要交換的節點下面無法很好的操作。 使用遞歸來實現,但要提前清除是什么順…

DNS-Windows上使用DNS

DNS-Windows上使用DNS一、查看與修改DNS配置1.1、查看當前DNS服務器設置1.2、臨時修改 DNS 服務器(命令行)二、DNS緩存相關操作2.1、查看DNS緩存內容2.2、 刷新 DNS 緩存(清除過期記錄)三、測試域名解析(nslookup 工具…

3dsMax 2026 .NET Core 8 轉型下的Maxscript腳本開發:動態編譯模塊的重構策略與兼容性升級路徑

3ds Max 長期以來一直提供出色的 .NET 集成,使 Maxscript 能夠無縫利用任何 .NET 庫的強大功能。部分開發者在工具中廣泛使用了 .NET 功能。 之前,3ds Max 依賴于 .NET Framework 4.8 并且最近更新到了 4.8.1,用于 2025 版本的發布。然而,隨著 3ds Max 2026 的推出,Autod…

golang 做webrtc開發核心

在Golang中進行WebRTC開發,核心在于理解WebRTC協議的工作原理以及如何利用Go生態中的庫來實現關鍵功能。以下是Golang WebRTC開發的核心要點: WebRTC基礎概念 了解ICE(Interactive Connectivity Establishment)協議用于NAT穿越掌握…

RabbitMQ 異步化抗洪實戰

說明:本文僅展示架構思路與安全片段,所有敏感字段已用占位符;不含可直接復刻的生產細節。數據與接口均為演示/虛擬。0. 背景與目標長耗時/不確定接口(如對接第三方機器人平臺)的同步阻塞,容易造成請求堆積與…

接口返回 2 萬條數據,easy-trans導致多了20s耗時排查過程

內網訪問排版核料詳情功能,用戶反饋要等十幾秒排查 sql:sql 比較簡單排查內存計算:arthus trace 類名 方法名 總耗時2s排查頁面渲染是否緩慢:F12 查看接口 等待服務器響應 20s 下載時間 30s, 故不考慮渲染問題排查請求響應日志打…

AIGC入門,手搓大模型客戶端與MCP交互

概述 在現代應用開發中,將大語言模型(LLM)與專用工具服務相結合,可以構建出既能理解自然語言,又能準確執行專業任務的智能代理。本文介紹一個基于 MCP(Model Context Protocol)協議和 Ollama 本…

深度學習:從預備知識到未來展望

在當今數字化時代,深度學習正以前所未有的速度改變著我們的生活和工作方式。從智能語音助手到自動駕駛汽車,從精準醫療到個性化推薦系統,深度學習的應用無處不在。本文將從深度學習的預備知識入手,探討其發展歷程、關鍵技術和未來…

軟考高級系統架構設計師之構件與中間件技術篇

一、構件的定義 定義1:軟件構件是一種組裝單元,它具有規范的接口規約和顯式的語境依賴。軟件構件可以被獨立地部署并由第三方任意地組裝。 定義2:構件是某系統中有價值的、幾乎獨立的并可替換的一個部分,它在良好定義的體系結構語境內滿足某清晰的功能。…

Node.js 文件上傳中文文件名亂碼問題,為什么只有Node會有亂碼問題,其他后端框架少見?

問題現象當用戶上傳包含中文字符的文件時,在服務器端獲取到的文件名可能變成類似 ????.txt 這樣的亂碼,而不是預期的中文文件名。為什么只有Node會亂碼?很多后端框架(如 Java Spring Boot、Python Django、PHP Laravel&#x…

學習英語音標 (從漢語角度看英語音標發音差異)

僅供參考, 跟著教學視頻看不懂時再來看以下引導 以下只寫容易出錯的音標 發音視頻: https://www.jiwake.com/yinbiaofayin/ 音標規則單詞??類似漢語e, 餓~urge?類似漢語e, 餓go??類似漢語o, 哦~walk?類似漢語o, 哦wash?/i?/的短語, 不止發聲短,舌頭不用隆起it?類似漢…

論文筆記(九十一)GWM: Towards Scalable Gaussian World Models for Robotic Manipulation

GWM: Towards Scalable Gaussian World Models for Robotic Manipulation文章概括摘要1. 引言2. 相關工作3. 高斯世界模型(Gaussian World Model)3.1. 世界狀態編碼(World State Encoding)3.2. 基于擴散的動態建模(Dif…