# 編程技巧,第 1 部分
> 原文:<https://github.com/angrave/SystemProgramming/wiki/Programming-Tricks%2C-Part-1>
## 使用`cat`作為 IDE
誰需要編輯? IDE?我們可以使用`cat`!您已經看到`cat`用于讀取文件的內容,但它也可用于讀取標準輸入并將其發送回標準輸出。
```
$ cat
HELLO
HELLO
```
要完成從輸入流中讀取,請按`CTRL-D`關閉輸入流
讓我們使用`cat`將標準輸入發送到文件。我們將使用'&gt;'將其輸出重定向到文件:
```
$ cat > myprog.c
#include <stdio.h>
int main() {printf("Hi!");return 0;}
```
(注意!不允許刪除和撤消...)完成后按`CTRL-D`。
## 使用`perl`正則表達式編輯代碼(又名“記住你的 perl 餡餅”)
如果要更改多個文本文件(例如源代碼),則使用正則表達式是一個有用的技巧。 `perl`使得編輯文件非常容易。記住'perl pie'并在網上搜索......
一個例子。假設我們要在當前目錄的所有.c 文件中將序列“Hi”更改為“Bye”。然后我們可以編寫一個簡單的替換模式,它將在所有文件中的每一行上執行:
```
$ perl -p -i -e 's/Hi/Bye/' *.c
```
(如果你弄錯了,不要驚慌,原始文件仍然存在;他們只有擴展名.bak)顯然你可以用正則表達式做更多的事情而不是改變 Hi 到 Bye。
## 使用你的 shell `!!`
要重新運行最后一個命令,只需鍵入`!!`并按`return`重新運行以 g 類型`!g`開頭的最后一個命令,然后按`return`
## 使用你的 shell `&&`
厭倦了運行`make`或`gcc`然后運行程序,如果編譯正常?相反,使用&amp;&amp;將這些命令鏈接在一起
```
$ gcc program.c && ./a.out
```
## Make 可以做的不僅僅是制作
您也可以嘗試在 Makefile 中添加一行以進行編譯,然后運行您的程序。
```
run : $(program)
./$(program)
```
然后跑
```
$ make run
```
將確保您所做的任何更改都已編譯,并一次運行您的程序。也適合一次測試多個輸入。雖然您可能只想為此編寫常規 shell 腳本。
## 你的鄰居太高效了嗎? C 預處理器救援!
使用 C 預處理器重新定義常用關鍵字,例如
```c
#define if while
```
Protip:將此行放入標準包含的內容之一,例如/usr/include/stdio.h
## 當 C 具有預處理器時,誰需要功能
好的,所以這更像是一個問題。使用看起來像函數的宏時要小心......
```c
#define min(a,b) a<b?a:b
```
a 和 b 的最小值的完全合理的定義。然而,預處理器只是一個簡單的文本管理器,所以優先級可以咬你:
```c
int value = -min(2,3); // Should be -2?
```
擴大到
```
int value = -2<3 ? 2 :3; // Ooops.. result will be 2
```
部分修復是用`()`包裝每個參數,用()包裝整個表達式:
```c
#define min(a,b) ( (a) < (b) ?(a):(b) )
```
不過這仍然是 _ 而不是 _ 的功能!例如,你能看出為什么`min(i++,10)`可能會增加一次或兩次!?
- UIUC CS241 系統編程中文講義
- 0. 簡介
- #Informal 詞匯表
- #Piazza:何時以及如何尋求幫助
- 編程技巧,第 1 部分
- 系統編程短篇小說和歌曲
- 1.學習 C
- C 編程,第 1 部分:簡介
- C 編程,第 2 部分:文本輸入和輸出
- C 編程,第 3 部分:常見問題
- C 編程,第 4 部分:字符串和結構
- C 編程,第 5 部分:調試
- C 編程,復習題
- 2.進程
- 進程,第 1 部分:簡介
- 分叉,第 1 部分:簡介
- 分叉,第 2 部分:Fork,Exec,等等
- 進程控制,第 1 部分:使用信號等待宏
- 進程復習題
- 3.內存和分配器
- 內存,第 1 部分:堆內存簡介
- 內存,第 2 部分:實現內存分配器
- 內存,第 3 部分:粉碎堆棧示例
- 內存復習題
- 4.介紹 Pthreads
- Pthreads,第 1 部分:簡介
- Pthreads,第 2 部分:實踐中的用法
- Pthreads,第 3 部分:并行問題(獎金)
- Pthread 復習題
- 5.同步
- 同步,第 1 部分:互斥鎖
- 同步,第 2 部分:計算信號量
- 同步,第 3 部分:使用互斥鎖和信號量
- 同步,第 4 部分:臨界區問題
- 同步,第 5 部分:條件變量
- 同步,第 6 部分:實現障礙
- 同步,第 7 部分:讀者編寫器問題
- 同步,第 8 部分:環形緩沖區示例
- 同步復習題
- 6.死鎖
- 死鎖,第 1 部分:資源分配圖
- 死鎖,第 2 部分:死鎖條件
- 死鎖,第 3 部分:餐飲哲學家
- 死鎖復習題
- 7.進程間通信&amp;調度
- 虛擬內存,第 1 部分:虛擬內存簡介
- 管道,第 1 部分:管道介紹
- 管道,第 2 部分:管道編程秘密
- 文件,第 1 部分:使用文件
- 調度,第 1 部分:調度過程
- 調度,第 2 部分:調度過程:算法
- IPC 復習題
- 8.網絡
- POSIX,第 1 部分:錯誤處理
- 網絡,第 1 部分:簡介
- 網絡,第 2 部分:使用 getaddrinfo
- 網絡,第 3 部分:構建一個簡單的 TCP 客戶端
- 網絡,第 4 部分:構建一個簡單的 TCP 服務器
- 網絡,第 5 部分:關閉端口,重用端口和其他技巧
- 網絡,第 6 部分:創建 UDP 服務器
- 網絡,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:遠程過程調用簡介
- 網絡復習題
- 9.文件系統
- 文件系統,第 1 部分:簡介
- 文件系統,第 2 部分:文件是 inode(其他一切只是數據...)
- 文件系統,第 3 部分:權限
- 文件系統,第 4 部分:使用目錄
- 文件系統,第 5 部分:虛擬文件系統
- 文件系統,第 6 部分:內存映射文件和共享內存
- 文件系統,第 7 部分:可擴展且可靠的文件系統
- 文件系統,第 8 部分:從 Android 設備中刪除預裝的惡意軟件
- 文件系統,第 9 部分:磁盤塊示例
- 文件系統復習題
- 10.信號
- 過程控制,第 1 部分:使用信號等待宏
- 信號,第 2 部分:待處理的信號和信號掩碼
- 信號,第 3 部分:提高信號
- 信號,第 4 部分:信號
- 信號復習題
- 考試練習題
- 考試主題
- C 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話