C語言命令行參數如何解析?你經常用的終端怎麼運行的你說不清楚!

2021-02-20 程式設計師入門進階

C語言必須寫main函數?最簡單的 Hello world 你其實一點都不懂!

是的,你沒有看錯,從今天開始,公眾號會持續原創一系列C語言的內容,同時穿插作業系統,組成原理,彙編,以及一些類比,目的是讓大家能夠在抽象中尋到具象,也是我想分享的計算機學習方法。


之前的我寫作,一直都是追求往前創新,而不想回顧過去自己的知識,但是這段時間在B站講課,直播,發現大家問的很多問題,其實我都遇見過,也找到了解決的方法,所以有了這個引子,也就有了這個專題。

這個專題當時寫了11個小節,然後在不斷細化後,越來越多,形成了體系,於是準備慢慢來說,把這個計算機的建立過程拆解,擺在大家面前,再也不是龐然大物,而是有跡可循。

今天我們說下,命令行參數,我們在寫工具的時候,基本上都是帶著參數的。而在windows XP或更高版本,命令行的最大長度為8191個字符,Linux下可以用這個命令查看,getconf ARG_MAX,一般情況下都是比windows大很多。

之前遇見編譯開源項目,爆出的錯誤是參數太長,通過映射路徑,windows下還是長,在Linux下可以編過,最後因為Linux開發的話難度太大,所以對腳本進行了調整,把源碼拆分,變成obj後,再進行連結,合併,從而減少參數長度。


那我們先看下命令行參數代碼怎麼寫?我們上一節寫的main,是最普通的main,現在常用的就兩種。

int main(void){}

int main(int argc,char *argv[]){}

我們平時寫的時候,用的第一種,但我們寫工具的時候,會用第二種,這個可以傳參,我們看下例子:



輸出效果是:

main函數的兩個參數,argc代表了參數個數,默認是1,也就是程序名字,argv[] 代表傳遞的參數具體字串,我們使用的時候用這個判斷即可。

看到這裡大家發現參數很簡單,我們平時使用也會用這個,但是這個不是標準的命令參數解析的方法,我們今天看下官方源碼是怎麼處理的,我們可以下載busybox開原始碼學習命令,也可以在https://directory.fsf.org/wiki/GNU 下載

Coreutils 軟體包包括一整套基本的 shell 工具,可以去看各個shell命令的實現,我們今天用busybox裡面的實現,來說下就可以。我這裡看的是ls的解析,這裡我們發現有個getoptxxx,這個就是系統提供的解析參數的方法。

我們找下標準的函數,getopt_long,而這個代碼的實現,是在glibc,這個可以在https://mirrors.aliyun.com/gnu/ 下載,當然這裡面有很多工具,都是GNU項目下的源碼,可以下載,比如我們的bash就是在這裡下載的。

如果你感興趣,而且真正要學習編程,把這個代碼下載下來,去閱讀下我們調用的系統方法,它們都是怎麼實現的。

我們這裡直接看用法,我們看下百度的說明:

這裡要去練習,我們測試下,看看效果:

輸出的結果:

這裡看下b和c的參數,如果必須要參數,是 -b 3 ,使用空格的。如果是可有可無的話,這裡-c4 ,c和4是連著的。

而我們平時所說的終端,就是一個程序,這裡參考bash的源碼,終端等待輸入參數,然後判斷之後,進行創建子進程,把參數傳遞進去,等待返回結果,大致的shell運行如下:

參看 https://blog.csdn.net/ruglcc/article/details/8574113

核心終端的操作邏輯是:fork 創建子進程,然後使用execvp這一組的進程替換程序的機制,進行運行實際的命令,同時使用pipe管道通信,等待子進程的運行結果,然後把結果顯示出來。

好了這一講就分享到這裡,下一節我們來說下,c語言從源碼到最終可執行程序,每一步都做了什麼,以及如何理解每個環節。

~~ end not end ~~

熱門文章

零基礎新手自學Python編程教程入門精通學習資料網站大全

自學編程C語言不迷路,我私藏的書單分享給你!

零基礎新手學習算法Leetcode刷題指南

程式設計師碼農IT工程師自學編程計算機入門進階學習網站大全

程式設計師面試題寶典以及相關書籍下載!

計算機類常用電子書整理大全

職場老鳥,網際網路十年從業生涯,分享 [Java,Python,安卓,AI,爬蟲] 技術文章,學習資料, 熱點趣聞等。關注回復 1024 Python 電子書大全 面試資料,給你一份私藏的程式設計師好禮,永遠更新中!趕緊來關注哦!

我的微信 code_gg_boy 。

相關焦點

  • c語言main函數裡的參數argv和argc解析
    :argc和argv,那麼這兩個參數是表示什麼意思,怎麼用呢?(1)main函數是特殊的,首先這個名字是特殊的;因為在c語言裡面規定了main函數是整個程序的入口;其它函數只有直接或者間接被main函數所調用才能被執行,如果沒用被main函數直接或者間接調用,則這個函數在整個程序中無用。
  • 嵌入式——C語言 1day
    linux系統以命令行形式來進行交互。結論:要操作linux,首先必須要知道一些簡單的指令。九、在linux下使用命令來作業系統,那麼這些命令是寫在哪裡的?命令是寫在命令行上,而命令行是在一個終端(Terminal)上,所以首先我們要先打開一個終端。1、先打開一個新的終端。
  • C語言|命令行參數
    執行程序時,可以從命令行傳值給 C 程序。這些值被稱為命令行參數,它們對程序很重要,特別是當您想從外部控制程序,而不是在代碼內對這些值進行硬編碼時,就顯得尤為重要了。
  • 【C語言】02.第一個C語言程序
    1.用什麼工具寫代碼首先我們要做的肯定是寫代碼,在代碼裡面說清楚想要計算機做出怎樣的操作。其實寫代碼就像平時寫文章一樣,只是在電腦上寫一些文本內容,那用什麼工具來寫代碼麼?平時我們在Windows中寫文章,可以用記事本、Word等文本編輯工具。在Mac中呢,我們可以安裝一些文本編輯工具來寫代碼,比如UltraEdit(點擊連結可以下載UltraEdit)。
  • 編程模板-R語言腳本寫作:最簡單的統計與繪圖,包安裝、命令行參數解析、文件讀取、表格和矢量圖輸出
    之前分享過我個人的《Shell語言》和《Perl語言》腳本寫作模板(藍色字為連結直達),今天再分享一下我的R語言模板,一次性解決困擾新手的眾多問題,如包安裝、命令行參數解析、文件讀取、老司機盡情拍磚,指導我寫出更好用、更規範的腳本。模板主要內容此模板主要以下分為5部分:1. 程序功能描述和分析思路每次寫腳本,一定要寫清楚程序的功能、實現的主要步驟,每個參數的詳細說明和使用示例。如果英語描述不方便理解,建議中英文全寫,方便自己和同行快速理解。千萬要認識寫清楚這些,現點養成好習慣,將來節省的時間會更多。
  • C/C++學習----使用C語言代替cmd命令、cmd命令大全
    一、通過C語言代碼來實現cmd命令行功能:這裡用到了c語言中的一個庫:#include<stdlib.h>  PQ和Acronis Disk Director這兩個工具都可以在不丟失數據的情況下對分區進行調整大小,以及合併等操作,XP系統的話你用PQ,WIN7系統的話用Acronis Disk Director 操作基本一樣,可以去網上找教程來看看,再不重裝系統的情況下都能調整分區大小,但是建議你還是先備份下數據再調整,畢竟對硬碟直接進行的操作有一定的危險性。
  • Python 命令行參數解析庫argparse
    output_source_dir,feature,levels,但是該函數print不能在命令行運行,只能在腳本內部調用,於是我們需要python標準庫內的argparse[1]來幫忙。使用步驟:1)import argparse    首先導入模塊2)parser = argparse.ArgumentParser()    創建一個解析對象3)parser.add_argument()    向該對象中添加你要關注的命令行參數和選項4)parser.parse_args()    進行解析對於第
  • Notepad++編譯和運行C語言(GCC)
    我們在學習C語言的時候,實際上只需要編譯器和編輯器就能開搞了。(初學者過早接觸IDE不利於理解程序構建的過程)在看這篇文章的時候,假設你已經知道如何把GCC配置到環境變量,並且會在命令行/終端下使用gcc 編譯C代碼文件 並運行了。
  • 命令行工具開發:如何快速實現命令行提示?
    阿里妹導讀:對於稍微複雜一些的命令行工具,命令行的提示功能必不可少。那麼對於不同語言的開發者,有沒有一種簡單快捷的實現方式呢?本文分享一種快速實現的方法,使用YAML文件定義命令行工具的使用規範,再通過工具自動生成各種shell的命令行提示腳本,最後分享一些至關重要的命令行解析器。
  • C/C+編程筆記:C語言預處理命令是什麼?不要以為你直接寫#就行!
    很多小夥伴在自己寫代碼的時候,已經多次使用過#include命令。使用庫函數之前,應該用#include引入對應的頭文件。其實這種以#號開頭的命令稱為預處理命令。
  • Linux nohup命令詳解,終端關閉程序依然可以在執行!
    而這個情況肯定不是我們想看到的,我們希望即使終端關閉,程序依然可以在跑。這時我們就可以使用 nohup 這個命令。nohup 命令是英語詞組 no hangup 的縮寫,意思是不掛斷,也就是指程序不退出。這個命令會使程序忽略 HUP 信號,保證程序能夠正常進行。
  • 給你Python程序構建一個優雅的終端CLI界面
    我們知道在Linux下有優雅的shell終端命令行界面,shell腳本都可以優雅用命令行的方式來運行。而且shell也再帶優化命令行參數解析的bash內部命令getopts和大多數發行版附帶的外部命令getops。Perl語言也有Getopt::XX系列模塊來實現類似功能;Golang也有flag標準庫以及更加強大的第三庫cobra。
  • (宇宙最強C/C++編譯器)樂創DIY C語言講義​——2.6 GCC的使用
    2.6 GCC的使用有些同學可能會疑問,之前我們還說我們的C語言編譯器用的是一個叫做「MinGW」的軟體,怎麼到後來又出現了一個叫
  • Linux nohup 命令詳解,終端關閉程序依然可以在執行!
    而這個情況肯定不是我們想看到的,我們希望即使終端關閉,程序依然可以在跑。這時我們就可以使用 nohup 這個命令。nohup 命令是英語詞組 no hangup 的縮寫,意思是不掛斷,也就是指程序不退出。這個命令會使程序忽略 HUP 信號,保證程序能夠正常進行。
  • Fragstats官方入門教程5 從R運行命令行版本的Fragstats
    教程5 從R運行命令行版本的FRAGSTATS在本教程中,你將從R運行命令行版本的FRAGSTATS:R開發核心團隊(2008年):R:一種用於統計計算的語言和環境。R統計計算基金會,奧地利,維也納。ISBN 3-900051-07-0, URL http://www.R-project.org。
  • 【python】命令行參數argparse用法詳解
    argparse提供了對參數類型的解析,如果類型不符合,則直接報錯。第一行定義了一個互斥組,第二、三行在互斥組中添加了-v和-q兩個參數,用上個例子中的程序進行如下測試:可以看出,-q和-v不出現,或僅出現一個都可以,同時出現就會報錯。可定義多個互斥組介紹了這麼多,有沒有參數默認值該如何定義呢?
  • 在Stata中編寫估計命令:編寫C語言插件
    這篇文章演示了如何用其他語言(如C,C 或Java)編寫的代碼插入到Stata中。這種技術被稱為Stata編寫插件或編寫動態連結庫(DLL)。本文中,在C語言中編寫一個插件,它實現了mymean11.ado中mymean_work()執行的計算,在文章在Stata中編寫估計命令編寫插件中討論過。
  • C語言必須寫main函數?最簡單的 Hello world 你其實一點都不懂!
    (gcc相關工具鏈,我經常用的是objdump )這裡的Interpreter,就是解析程序,crtstuff.c這個就是給我們的運行環境,做初始化。從這裡我們就能看到,其實我們的一個簡單的程序,也是五臟俱全的。
  • C語言必須寫main函數?最簡單的Hello world 你其實一點都不懂!
    (gcc相關工具鏈,我經常用的是objdump )這裡的Interpreter,就是解析程序,crtstuff.c這個就是給我們的運行環境,做初始化。從這裡我們就能看到,其實我們的一個簡單的程序,也是五臟俱全的。
  • 如何用 C 語言寫一個簡單的 Unix Shell
    只用一句話說明:shell 是允許你與作業系統的核心作交互的一個界面(interface)。shell 是怎樣工作的?shell解析用戶輸入的命令並執行它。為了能做到這一點,shell的工作流程看起來像這樣:啟動shell等待用戶輸入解析用戶輸入執行命令並返回結果回到第 2 步。