Linuxの基本的な開発ツール

目次

序文

1. yum - ソフトウェアパッケージ管理ツール        

1.1 yum の概要        

1.2 yumの使用

1.3 yum ソースのアップデート        

2. vim - テキストエディタ

2.1 vim の基本概念

2.2 vimの基本操作

2.3 vim ノーマルモードコマンドセット

2.4 vim エンドラインモードコマンドセット

追加のvimサプリメント

追加のバッチコメント 1 つ

extra2 にファイルを作成する 3 つの方法

extra3 vim はマルチウィンドウ作業をサポートします

extra4 vimの簡単な設定

3. gcc/g++ - コンパイラ

3.1 gcc/g++ の使用デモ

3.2 プログラムの翻訳      

3.3 動的ライブラリと静的ライブラリの概念と理解        

4. make/Makefile - 自動ビルドツール

4.1 make/makefile の使用のデモンストレーション      

4.2 make/makefile の基本原理を理解する        

追加のメイク/メイクファイルの補足      

5. 小さなプログラムを書く - プログレスバー      

5.0 バッファ、キャリッジリターン、ラインフィード

5.1 単純な原則バージョン

5.2 エンジニアリング実践編        

5.3 C言語拡張(スタイル美化)        

6. git/gitee/github について知る        

6.1 git とは        

6.2 gitの特徴

6.3 gitの使用        

追加の .gitignore ファイル        

7. gdb - デバッガ

7.1 デバッグ&リリースとは何ですか         

7.2 gdbの使用



序文

        一般的な Linux コマンドと権限、その他の基本的な問題について基本的に理解してから、このブログを読んでいただければ幸いです。

        Windows オペレーティング システムや携帯電話の Android システムを使用する場合、システムのデフォルト ソフトウェア ツールの一部を常に使用できるわけではありません。Word、Excel、ppt などの基本的な開発ツールを追加する場合があります。それらの使用に習熟するにつれて、ps、devC++、Python などのより強力な開発ツールも必要になる場合があります。一部の開発ツールをダウンロードしてインストールすることもあります。私たちの体験を豊かにするゲーム、オンライン生活。次に、Linux の基本的な開発ツールとその使用方法を見てみましょう。


1. yum - ソフトウェアパッケージ管理ツール        

1.1 yum の概要        

        Linux にソフトウェアをインストールする場合、一般的な方法は、プログラムのソース コードをダウンロードし、それをコンパイルして実行可能プログラムを取得することです。しかし、これはあまりにも面倒なので(ソースコード自体にバグがある可能性があり、学習段階にある私たちにとってソースコードのコンパイルは非常に困難であり、プログラム自体が他のプログラムやサードパーティのライブラリに依存している可能性があります)、いくつかの一般的に使用されるソフトウェアの中には、事前にコンパイルされてソフトウェア パッケージ (Windows のインストール プログラムとして理解できます) に作成され、サーバー上に配置されるものがあります。コンパイルされたソフトウェア パッケージは、ソフトウェア パッケージ マネージャーを通じて簡単に取得でき、直接インストールできます (インストールの本質は、実行可能プログラムを指定されたパスにコピーすることです)。読者の中には、これは携帯電話のアプリ ストアやその他のソフトウェアとまったく同じではないかとすぐに思う人もいるかもしれません。実際、ソフトウェア パッケージとパッケージ マネージャーは、「App」と「App Store」の関係に似ています。
        yum (Yellow Dog Updater、修正版) は、Linux で非常に一般的に使用されるパッケージ マネージャーです。主に Fedora、RedHat、Centos などのディストリビューションで使用されます。yum と yum の生態の概要は以下の図を見れば分かります
        が、Linux サーバーは外国人によって構築されており、そのリソースのほとんども外国人によって提供および共有されているため、そう簡単に理解することはできないかもしれません。これらのリソースを直接取得します (? ネットワーク セキュリティの問題が含まれます)。そのため、一部のミラーソースは中国でも提供されており、通常はyumコマンドを使用して国内のミラーソースからソフトウェアパッケージのリンクを取得します。        

1.2 yumの使用

これで、実際に実行して、yum を介して興味深いソフトウェア手順をダウンロードできるようになりました。

安装软件需要较高的权限,可以通过sudo或切换到root账号执行命令
安装指令:yum install -y sl
卸载指令:yum remove sl
sl      #此命令可以在屏幕上驶过一辆小火车
sl -c	#显示有故障的小火车
sl -F	#小火车驶过的过程中缓缓上升

读者可以自行搜索更多有趣的指令...

如果发现这些指令无法执行,可以先安装一个yum源插件
yum install -y epel-release

 写真のように、「ls」コマンドを誤って「sl」と書いてしまうと、小さな電車が作業を中断してしまいます。       

「yum list」コマンドを使用すると、現在利用可能なソフトウェア パッケージを一覧表示できます。ソフトウェア パッケージの数が非常に多い可能性があるため、ここでは grep コマンドを使用してフィルタリングできます。

1.3 yum ソースのアップデート        

        現在クラウドサーバーを使用している場合、使用している yum ソースはおそらくすでに設定されています。現在仮想マシンを使用している場合、使用している yum ソースは国内のものではない可能性があります。CentOS7 を例として yum ソースを更新しますが、他に混乱がある場合は、より専門的で詳細な情報を自分で検索して読むことができます。     

⭐进入yum源配置文件夹
cd /etc/yum.repos.d/

⭐做好备份,以绝后患
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

⭐获取国内的yum源    
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
(如果wget命令没有生效,输入yum -y install wget 安装wget工具)
http://mirrors.aliyun.com 阿里镜像源域名

⭐把国内的yum源,移动到对应的目录下
mv CentOS-Base.repo /etc/yum.repos.d/

        


2. vim - テキストエディタ

        IDE (統合開発環境) は、アプリケーションにプログラム開発環境を提供するために使用される統合開発環境であり、一般に、コード エディター、コンパイラー、デバッガー、グラフィカル ユーザー インターフェイスなどのツールが含まれます。私たちは通常、Windows オペレーティング システムの統合開発環境でコードを作成します。Linux オペレーティング システムでは、コードの作成、コードのコンパイル、コードの実行までの各ステップを独立させることができます。つまり、プロセスの各ステップを完了するために複数のソフトウェアを使用できます。

2.1 vim の基本概念


まず、vim で最もよく使用される 3 つのモード、コマンド モード、挿入モード、最終行モードを見てみましょう。各モードの機能は次のように区別されます:
ノーマル モード (ノーマル モード)
、コマンド モードとも呼ばれ、コントロール画面カーソルの移動、または vim の他のモードに入ります。他のモードでは、「ESC」キーを押してコマンドラインモード (
挿入モード)
に戻ります。コマンドモードで「i」キーを押すと、このモードに入ります。このモードでのみ、キーボードからファイルに内容を入力できます。
ラスト ライン モード (ラスト ライン モード)
はボトム ライン モードとも呼ばれます。コマンド モードで、「shift」+「;」キーを押すと、このモードに入ります。このモードでは、ファイルの保存または終了、ファイルの置換、文字列の検索、行番号のリストなどを行うことができます。

すべてのモードを表示します: vim を開き、最終的なモードを直接入力します: help vim-modes

2.2 vimの基本操作

 $vim test.c コマンドを入力して、vim ツールを通じて test.c ファイルを編集します。一般に、vim に入った後、通常モードでの

        これらの短い操作は一部の読者にとっては困難かもしれません。vim は非常に不便なので、なぜまだ行うのでしょう使い方を学ぶ必要がありますか? 他のコンパイラでコードを書くのは良いことではないでしょうか? 実際、初期のコンピュータにはマウスがなく、キーボードでコマンドを入力してテキストを編集することしかできず、vim が誕生しました。コードを記述するだけの場合、vim は私たちが通常使用するソフトウェアほど優れたものではありませんが、vim には独自の利点もあります。

2.3 vim ノーマルモードコマンドセット

​⭐插入模式

按「i」切换进入插入模式「insert mode」,从光标当前位置开始编辑
按「a」进入插入模式后,从光标所在位置的后一个位置开始编辑
按「o」进入插入模式后,在光标所在位置的下面插入新的一行,并从行首开始编辑
从插入模式切换到命令模式    按「ESC」键

⭐移动光标

vim可以直接用键盘上的光标来上下左右移动,
但标准情况下vim使用的是小写英文字母「h」-> "←"「j」-> "↓"「k」-> "↑"「l」-> "→"
按[gg]:进入到文本的开始位置
按[shift+g]/「G」:移动到文本的结尾位置
按[n+shift+g]/「G」:移动到文本的第n行
按「$」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按「#l」:光标移到该行的第#个位置,如:5l,56l
按「w」:光标跳到下个word的开头
按「b」:光标回到上个word的开头
按「e」:光标跳到下个word的末尾

按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页

⭐复制粘贴

「yy」: 复制 光标所在行
「#yy」:复制 从光标所在行开始的共#行文本

「yw」: 复制 从光标所在位置开始到字尾
「#yw」:复制 从光标所在位置开始的共#个字

「dd」: 剪切 光标所在行
「#dd」:剪切 从光标所在行开始的共#行文本

「p」: 粘贴 缓冲区里的文本到光标所在位置
「#p」:粘贴 重复进行粘贴操作#次
注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

⭐撤销上一次操作

「u」:撤销上一次操作
「ctrl + r」: 取消上一次的撤销操作

⭐删除文字

「x」: 删除 光标所在位置的一个字符
「#x」:删除 从光标所在位置开始的共#个字符
「X」: 删除 光标所在位置的前一个字符(大写的X)
「#X」:删除 从光标所在位置开始(向前数)的共#个字符

⭐替换

「r」: 替换 光标所在位置的字符
「#r」:替换 从光标所在位置开始的共#个字符
「R」:进入替换模式(替换光标所在位置的字符),「ESC」键回到命令模式

⭐更改

「cw」: 更改 光标所在位置的字到字尾
「c#w」:更改 从光标所在位置开始的共#个字到字尾

「shift + ~」:大小写互换(长按shift,点按~,光标右移并把光标选中的字符大小写互换)

2.4 vim エンドラインモードコマンドセット

最終行モードを使用する前に、必ず「ESC」キーを押して通常モードになっていることを確認し、「:」コロンを押して最終行モードに切り替えてください。

⭐列出行号

「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号

⭐跳到文件中的某一行

「#」:「#」表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了
如输入数字15,再回车,就会跳到文章的第15行

⭐查找字符

「/关键字」: 先按「/」键,再输入想寻找的字符串,如果第一次找的关键字不是想要的,
可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入想寻找的字符串,如果第一次找的关键字不是想要的,
可以一直按「n」会往前寻找到您要的关键字为止。

⭐保存文件

「w」: 在冒号后输入字母「w」就可以将文件保存起来

⭐离开vim

「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim
「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件

vi/vim キーマップ (画像はインターネット検索からのもの)

追加のvimサプリメント

追加のバッチコメント 1 つ

        コマンド モードで、「Ctrl + v」を押して表示モードに入ります。- - VISUAL BLOCK - - が左下隅に表示され、現在表示モードであることを示します。

1.「Ctrl + v」で表示モードに入ります

2.「j」「k」で上下のエリアを選択

3.「シフト+i」

4. // ダブルスラッシュコメント

5. Esc キーを押してバッチ処理を完了します

コメントを一括で削除します。

1.「Ctrl + v」で表示モードに入ります

2.「h、j、k、l」で上下左右の範囲を選択

3.「d」コメント削除

extra2 にファイルを作成する 3 つの方法

1. ファイル名をタッチします

2. 「リダイレクト>myfile.c」と入力します。        

3.vimコード.c        

vim を使用して存在しないファイルを開き、保存して終了して新しいファイルを作成します。

extra3 vim はマルチウィンドウ作業をサポートします

        ボトムライン モードで、vs + ファイル名を入力してウィンドウを追加します。カーソルがある領域は、現在作業しているファイルを示します。「Ctrl+w+w」で複数のウィンドウを切り替えることができます。

extra4 vimの簡単な設定

1. 基本構成
        まず、vim の構成原理を予備的に理解しましょう。vim が起動すると、現在のユーザーの /home ディレクトリにある .vimrc ファイルが自動的にスキャンされ (存在しない場合は作成されます)、.vim 内のオプションが作成されます。 vimrc ファイルが有効になります。実際、vim 設定の核心は、.vimrc ファイルに設定オプションを追加することです (読者は、利用可能な vim 設定オプションをオンラインで検索し、個人的に追加できます)。   

2. プラグインをインストールする

        さらに高度な要件がある場合は、ネイティブ構成が完全に機能しない可能性があるため、構成を完了するためにプラグインをインストールすることを選択できます。同様に、vim プラグインを保存するには、最初に .vim ディレクトリを作成する必要があります。

        プラグインのインストール原理は基本構成と似ていますが、操作はより複雑かつ多様であり、考えられる問題は無限にあります。この記事では長さに制限があるため、詳細は紹介しません。興味のある読者は、インターネットで関連するチュートリアルを検索してください。
                 


3. gcc/g++ - コンパイラ

        これまでの学習により、vim を使用してコードを作成できるようになりました (コードをより快適に作成できるように vim を構成できます)。次に、Linux で一般的に使用されるコンパイラgcc/g++を紹介します(gcc/g++ は C 言語のコンパイルに使用でき、g++ のみ C++ のコンパイルに使用できます)。

3.1 gcc/g++ の使用デモ

        まずは実際に動作させてみましょう(現在 Linux に gcc/g++ がインストールされていない場合は、yum install gcc または yum install gcc-c++ でインストールしてください。インストール完了後、どちらの gcc/g++ がインストールが成功したかを確認します)

注: Linux システムでは、ファイル接尾辞は無意味ですが、gcc/g++ がファイル接尾辞を気にしないという意味ではありません。ファイルのサフィックスが間違っていると、gcc/g++ のコンパイルが失敗します。        

3.2 プログラムの翻訳      

ソースファイル→前処理→コンパイル→アセンブリ→リンク→実行プログラム        

注: 以下の内容は理解のみを目的としています。このプロセスを理解することは、プログラムの翻訳をより深く理解するのに役立ちます。

⭐前処理_        

まず読者に実際の操作を体験させ、対応する操作に必要な命令を学習し、前処理の前後のコードを比較します。

コードの前処理効果を見てみましょう        

条件付きコンパイルを通じて、コードの動的な調整を実現できます。        

        実際には、Visual Studio、idea、Xshell、VMware など、ユーザーの ID に応じてさまざまな機能を開くソフトウェアが数多くあります。多くのソフトウェアには、パーソナル/フリー/コミュニティ エディションとプロフェッショナル エディションがあります。バージョンは完全な機能を備えており、一般的な学習と使用には十分です、プロフェッショナルバージョンは非常に豊富な機能を備えていますが、一定の料金がかかります。会社を設立して同様のソフトウェアを開発する場合、このソフトウェアの背後にあるソース コードを 2 つのコピー (無料バージョンのソース コード 1 つとプロフェッショナル バージョンのソース コード 1 つ) で維持する必要があると思いますか? 条件付きコンパイルを使用すると、1 つのコードで 2 つの異なる機能 (無料バージョンとプロフェッショナル バージョン) を同時に実行できるため、リソース コストをさらに節約できます。

⭐コンパイル        

⭐コンピレーション       

⭐まとめ    

上記の紹介と分析を読んだ後、多くの疑問を抱いたかもしれませんが、学ぶ必要がある指示は 1 つだけです。        

 gcc code.c -o mybin.exe  

ヒント: 前処理、コンパイル、およびアセンブリに対応するコマンド オプションを思い出せない場合は、キーボードの左上隅にある「Esc」   を参照してください。     

        

3.3 動的ライブラリと静的ライブラリの概念と理解        

3.2ではプログラム翻訳の前処理、コンパイル、アセンブリのみを紹介しましたが、次はリンクについて詳しく        紹介します実際、これまでに書いたコードはすべて巨人の肩の上に立っています (直接使用できる関数インターフェイスがすでに誰かによって書かれています)。ヘッダー ファイルをインクルードするだけでよく、何も必要ありません。内部の関数を使用してください。もちろん、これらのヘッダー ファイルは Linux のディレクトリにプレインストールされています。

リンクとは何かを説明する前に、まず関数ライブラリという新しい概念を理解する必要があります。        

        今回の C プログラムでは、「printf」の関数実装は定義されておらず、プリコンパイルに含まれる「stdio.h」には関数の宣言のみがあり、関数の実装は定義されていません。 "printf" "関数についてはどうでしょうか?
システムは、これらの関数の実装を libc.so.6 という名前のライブラリ ファイルに置きます。指定しない場合、gcc は
システムのデフォルトの検索パス "/usr/lib" の下で検索します。 libc.so.6 ライブラリ関数にリンクして、関数 "printf" を使用できるようにします。これがリンクの役割です。

        取得した実行可能プログラム = 作成したコード + ヘッダー ファイル + ライブラリ 

        ヘッダー ファイルとライブラリは本質的にはファイルであり、いわゆる開発環境の構築とは、基本的に、ヘッダー ファイルとライブラリを開発環境の特定のパス (コンパイラ自体によって検出される必要があります) にダウンロード、インストール、コピーすることを意味します。 

動的ライブラリと静的ライブラリの概念を詳しく見てみましょう 

ダイナミック ライブラリ (ダイナミック リンク) : C/C++ またはその他のサードパーティによって提供されるすべてのメソッドのコレクションであり、すべてのプログラムによってリンクされます (ライブラリ内のすべての関数にはエントリ アドレスがあります。いわゆるダイナミック リンクは実際には関数です)リンクされるライブラリ内のアドレスは、実行可能プログラム内の特定の場所にコピーされます)        

静的ライブラリ (静的リンク) : C/C++ またはその他のサードパーティによって提供されるすべてのメソッドのコレクションであり、すべてのプログラムによって、必要なコードを独自の実行可能プログラムにコピーするためにコピーされます

動的リンクと静的リンクの長所と短所:

動的リンクによって形成された実行可能プログラムは、占有スペースが少なくなり、リソースが節約されます。ただし、動的ライブラリがなくなると、このライブラリに依存するすべてのプログラムは実行できなくなります。静的リンクは、ライブラリに依存せず、独立して実行できます。 、ただし、より多くのスペースを必要とし、大きく、リソースを比較的無駄にします。

ヒント: クラウド サーバーを使用している場合、通常、システムには静的リンクがインストールされていません。必要に応じて、以下の手順を参照してください。

sudo yum install -y glibc-static         # 安装C静态库
sudo yum install -y libstdc++-static     # 安装C++静态库

        


4. make/Makefile - 自動ビルドツール

        Make はコマンド、makefile はカレントディレクトリに存在する特定形式のテキストファイルで、この 2 つを併用することでプロジェクトの自動構築が完了します(プロジェクト内のソースファイルはカウントされず、次のように分かれています)メイクファイルは、タイプ、関数、およびモジュールをそれぞれ複数のディレクトリに配置し、どのファイルを最初にコンパイルする必要があるか、どのファイルを後でコンパイルする必要があるか、どのファイルを再コンパイルする必要があるか、およびさらに複雑な関数を指定する一連のルールを定義しますいわゆる自動ビルド(つまり、make コマンドが 1 つだけ必要で、プロジェクト全体が完全に自動的にコンパイルされるため、ソフトウェア開発の効率が大幅に向上します)  

4.1 make/makefile の使用のデモンストレーション      

まずは実際の操作を通して、詳しい知識を理解していきましょう。        

4.2 make/makefile の基本原理を 理解する       

次に、make/makefile の基本原則を見てみましょう。        

make/makefile は古いファイルと新しいファイルをどのように識別しますか? 「PHONY」で変更された対象ファイルは常に実行可能という文の意味を理解するにはどうすればよいですか
make/makefile は依存関係を導出することができます

        make コマンドを実行すると、make は現在のディレクトリで「Makefile」または「makefile」という名前のファイルを探します。Makefile が見つかった場合は、ファイル内の最初のターゲット ファイル (mybin) を上から下に探します。ファイルが存在しない場合、または mybin が依存する code.o ファイルの変更時刻がターゲット ファイルより新しい場合 (タッチを使用してテストできます)、後で定義されたコマンドが実行されて mybin ファイルが生成されます。同様に、mybin が依存する code.o ファイルが存在しない場合、make は現在のファイル内の code.o ファイルをターゲットとする依存関係を探し続けます。それが見つかった場合 (code.s)、徐々にロールします。 mybin ファイルが生成されるまで、依存関係に従って元に戻ります。これは、make/makefile の依存関係の派生機能です。Make は、最初のターゲット ファイルが最終的にコンパイルされるまで、ファイルの依存関係をレイヤーごとに検索します。 注:ファイルの検索プロセス中にエラーが発生した場合 (たとえば、最後の依存ファイルが見つからない場合)、make は検索を直接終了し、エラー メッセージをエコーし​​ます。make にはファイルの依存関係を推測する機能しかなく、依存関係を見つけた後にコロンの後のファイルが存在しない場合、make は何も行いません。
       

追加の メイク/メイクファイルの補足      

        


5. 小さなプログラムを書く - プログレスバー      

5.0 バッファ、キャリッジリターン、ラインフィード

5.1 単純な原則バージョン

まずはコード構造の概要を見てみましょう        

次に、進行状況バーの単純なバージョンを実装する手順を説明します。        

        もちろん、これは単なる進行状況バーであり、実際にはその役割 (ダウンロードとインストールのタスクの進行状況をリアルタイムで表示する) を果たしているわけではありません。ソース コードに興味がある場合は、以下で共有していますが、立ち去らないでください。 、エンジニアリング実践バージョン プログレスバーはより実用的な意味があり、研究する価値があります。        

FILE->main.c
#include "process.h"

int main()
{
  process();
  return 0;
}

///
FILE->process.h
#pragma once

#include <stdio.h>

void process();

///
FILE->process.c
#include "process.h"
#include <string.h>
#include <unistd.h>

#define SIZE 101
#define MAX_RATE 100
#define STYLE '#'
#define SLEEPTIME 1000*200

const char *str="|/-\\";

void process()
{
  // version 1
  int rate=0;
  //char bar[SIZE] = {0};
  char bar[SIZE];
  memset(bar, '\0', sizeof(bar));
  int len = strlen(str);

  while(rate <= MAX_RATE)
  {
    printf("[%-100s][%d%%][%c]\r", bar, rate, str[rate%len]);
    fflush(stdout);
    usleep(SLEEPTIME);
    bar[rate++] = STYLE;
  }
  printf("\n");
}

        

5.2 エンジニアリング実践編        

実際のダウンロードおよびインストールのタスクに合わせて進行状況バーを表示する必要がある場合は、進行状況バーを一度に印刷することはできず、タスクの進行状況に基づいて進行状況バーをリアルタイムで更新する必要があります。        

ソースコード:        

FILE->main.c

#include "process.h"

#define TARGET_SIZE 1024*1024   // 1M
#define DSIZE 1024*10   // 10kb

// 模拟下载
  
void download(callback_t cb)
{
  int target = TARGET_SIZE;
  int total = 0;

  while(total < target)
  {
    // 休眠模拟下载花费的时间
    usleep(SLEEPTIME);
    total += DSIZE;
    int rate = total*100/target;
    cb(rate);   // 回调函数
  }
  printf("\n");
}

int main()
{
  download(process_v2);
  return 0;
}

///
FILE->process.h
#pragma once

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MAX_RATE 100
#define SIZE 101
#define STYLE '#'
#define SLEEPTIME 1000*200

typedef void (*callback_t)(int);

void process_v1();
void process_v2(int rate);

///
FILE->process.c

#include "process.h"

const char *str="|/-\\";

void process_v2(int rate)
{
  // version 2
  static char bar[SIZE] = {0};
  int len = strlen(str);

  if(rate <= MAX_RATE && rate >= 0)
  {
    printf("[%-100s][%d%%][%c]\r", bar, rate, str[rate%len]);
    fflush(stdout);
    bar[rate] = STYLE;
  }
  if(rate == MAX_RATE)
    memset(bar, '\0', sizeof(bar));
}

        

5.3 C言語拡張(スタイル美化)        

このコードは軽量であり、参照のみを目的としています。必要に応じて、より良いコードをオンラインで検索することをお勧めします。        

FILE->main.c

#include "process.h"

#define TARGET_SIZE 1024*1024   // 1M
#define DSIZE 1024*10   // 10kb

// 模拟下载
  
void download(callback_d cb)
{
  int testcnt = 80;
  int target = TARGET_SIZE;
  int total = 0;

  while(total <= target)
  {
    usleep(SLEEPTIME);
    total += DSIZE;
    double rate = total*100.0/target;
    // 测试进度条停滞的情况,稍等几秒
    if(rate > 50.0 && testcnt) 
    {
      total = target/2;
      testcnt--;
    }
    cb(rate);   // 回调函数
  }
  cb(MAX_RATE);
  printf("\n");
}

int main()
{
  download(process_v3);
  return 0;
}

///
FILE->process.h
#pragma once

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MAX_RATE 100
#define SIZE 101
#define STYLE '#'
#define STYLE_BODY '=' 
#define STYLE_HEADER '>'
#define SLEEPTIME 1000*60

typedef void (*callback_t)(int);
typedef void (*callback_d)(double);

void process_v1();
void process_v2(int);
void process_v3(double);

///
FILE->process.c

#include "process.h"

const char *str="|/-\\";

void process_v3(double rate)
{
  // version 3
  static char bar[SIZE] = {0};
  static int cnt = 0;
  int len = strlen(str);

  if(rate <= MAX_RATE && rate >= 0)
  {
    cnt++;
    cnt %= len;
    printf("加载中...\033[44m%-100s\033[0m[%.1f%%][%c]\r", bar, rate, str[cnt]);
    fflush(stdout);
    if(rate < MAX_RATE)
    {
      bar[(int)rate] = STYLE_BODY;
      bar[(int)rate+1] = STYLE_HEADER;
    }
    else
    {
      bar[(int)rate] = STYLE_BODY;
    }
  }
  if(rate == MAX_RATE)
    memset(bar, '\0', sizeof(bar));
}

// v3 优化了旋转光标,v2旋转光标依赖于rate,故进度条停滞会导致光标停止旋转
// 优化了rate的数据类型<double>
// 解释printf中的"\033[44m%-100s\033[0m"    \033[44m到\033[0之间的区域染为蓝色 

試験結果:

        


6. git/gitee/github について知る        

        記事の長さが限られているため、著者は最も一般的に使用される基本的な手順のみを紹介し、読者が git の基本原理を理解できるように支援します。

6.1 git とは        

        Git (愚かなコンテンツ トラッカー、愚かなコンテンツトラッカー。これが Linus Torvalds が私たちに Git を紹介した方法です。) は、非常に小規模なプロジェクトから非常に大規模なプロジェクトまでのプロジェクトのバージョン管理を効果的かつ高速に処理できるオープン ソースの分散バージョン管理システムです。[1]これは、 Linux カーネル開発の管理を支援するためにLinus Torvaldsによって開発されたオープン ソースのバージョン管理ソフトウェア でもあります 

                                                                                                                ——百度百科事典より抜粋

        では、バージョン コントローラーとは何でしょうか? よくある例を挙げると、ブログを書いて公開した後、数日後にどの部分を改善できるかを先生に手伝ってもらうように頼みます。それを聞いて、なるほどと思ったので、大幅に変更し、先生にアドバイスを求めました。先生の提案を聞いた後、さらに変更しましたが、最終的に先生はこう言いました。最初のバージョンはより簡潔で明確です。このとき何をすべきでしょうか?ブログの各バージョンを保存して記録すれば、そのことを心配する必要はありません。各バージョンを保存するこの方法は手動バージョン管理と呼ばれ、保存された各バージョンを保存するために使用されるスペースは ウェアハウス と呼ばますGit は、プログラミングの自動化 (変更に応じて保存されたコンテンツを管理し、最終的には変更プロセス中にさまざまなバージョンを提供する) を通じてこの機能を実現するソフトウェアです。さらに、独自の Web サイト (gitee/github) も必要です。        

6.2 gitの特徴

1. git はクライアントとサーバーの両方の役割を果たすソフトウェアです

2. git はコンテンツの変更のみを記録します (各バージョンのすべてのコンテンツは保存しません)。

3. git は分散ソフトウェアであり、分散化されています        

gitee/github は、バージョンを視覚化する (学習コストを削減する) ために git ソフトウェアに基づいて構築された Web サイトです        

6.3 gitの使用        

gitee/github URL:

Gitee - エンタープライズ レベルの DevOps R&D パフォーマンス プラットフォームは、コード管理、プロジェクト管理、ドキュメント コラボレーション、テスト管理、CICD、パフォーマンス測定、その他のモジュールを含むワンストップの R&D 管理ソリューションを企業に提供し、SaaS、民営化、その他の展開をサポートします。この方法は、企業が研究開発プロセスを秩序ある方法で計画および管理し、研究開発の効率と品質を向上させるのに役立ちます。icon-default.png?t=N7T8https://gitee.com/Linuxユーザー向けの新しいウェアハウスとオープン ソース リンクを作成するための図解付きチュートリアル

上記の操作が完了したら、git の 3 つの軸を紹介します。

追加の .gitignore ファイル        

vim .gitignore は、.gitignore ファイルを開いて編集できます。.gitignore に記録されたファイル (サフィックスの形式) は、ウェアハウスに送信されません。

        

        


7. gdb - デバッガ

7.1 デバッグ&リリースとは何ですか         

        プログラムをリリースするには、デバッグ モードとリリース モードの 2 つの方法があります。Linux gcc/g++ によってコンパイルされた実行可能プログラムは、デフォルトではリリース モードになっています。デバッグに gdb を使用する場合は、ソース コードから実行可能プログラムを生成するときに、デバッグ モードに -g オプションを追加する必要があります。
        さらに観察して、デバッグ モードとリリース モードに違いがあることを証明してみましょう。

        なぜ 2 つのリリースが必要なのか、不思議に思う人もいるかもしれません。全員がデバッグ バージョンを使用するのは良いことではありませんか? 実際、ユーザーが使用するプログラムはすべてリリース バージョンであり、リリース バージョンではコードにいくつかの最適化が行われています。

7.2 gdbの使用

gdbの基本的な共通コマンド一覧

gdb mybin 

# base 

ctrl d 或 quit:退出
list(l) 行号/函数名:    显示mybin的源代码,每次展示10行(或列出此函数的源代码)
run(r):   运行程序/开始调试
next(n):  逐过程(会一步完成整个函数调用
step(s):  逐语句(会进入函数的内部
set var  变量名:    修改变量的值
(print)p 变量名:    打印变量的值

# 断点

break(b) 行号/函数名:    在此行(或此函数的第一条语句处)设置断点
info(i) n:    查看序号为n的断点的信息
delete(d) n:  删除序号为n的断点
disable n:    禁用序号为n的断点
enable n:     启用序号为n的断点
i/d b:        查看/删除所有断点

# 监视

display 变量名:    跟踪查看一个变量,每次停下来都显示它的值
undisplay 序号:    取消对序号指代的变量的跟踪

# 代码块定位

until 行号:       跳至该行
finish:           运行到当前函数的结尾
continue(c):      运行到下一断点处

# 堆栈

breaktrace(bt):   查看调用堆栈
info(i) locals:   查看当前栈帧局部变量的值

@0. | number 查看代码
@1. gdb会记录上一次使用的指令,可以通过Enter快捷使用上一次使用的指令
@2. 每次调试过程中,断点序号是递增的,一旦退出调试,所有断点都将被清除


        


おすすめ

転載: blog.csdn.net/weixin_72501602/article/details/132829508