發表文章

目前顯示的是 2017的文章

(c/c++) Function Pointer函式指標兩三事 (Function Pointer 的 typedef 與 Array of Function Pointer)

圖片
 Function Pointer 定義: Function Pointer (中文直譯「函式指標」),即為 儲存某一個函式起始memory address的 變數 ,此變數可以提供我們在之後進行呼叫。 乍聽之下,function pointer就只是多一個別名再呼叫,似乎沒什麼實質的用處,但其實我們可以藉由function pointer省去繁複的 if/switch,後面會一一介紹。 使用方法:  現在假設我們有以下這個函式: int Square(int n) {     return n*n; } 然後宣告一個function pointer變數,以便於指向函式Square: int (*fptr)(int); fptr = Square; 這邊有幾個小細節必須注意: 1.最前面的int是變數data type(資料型態),和要指向的函式回傳值型態相同。第一個小括號代表指標變數名稱,第二個小括號代表傳入的parameter資料型態們,且理所當然的type必須與我們要指向的函式傳入值相同。 2. function pointer 的 pointer operator(*) 必須與變數名稱一起被小括號括起來 並接參數的小括號。若沒有這個小括號,會變成以下: int *fptr(int); 在意義上,表示fptr為一個"函式"而不是變數,回傳的資料型態為 int* ,會有3種情況;     a. 回傳一個pointer of int(整數指標變數的指標) -> int *a; return a;     b. 回傳一個address of int(整數一般變數的位址) -> int a; return &a;     c. 回傳一個int array(整數型態的陣列) -> int a[100]; return a; 延伸: 在知道function pointer的妙用前,還必須介紹以下兩種功能: 1.typedef typedef是c/c++中的關鍵字,其允許programmer為data type(資料型態)創造一個全新的名字。同時也可以為函式創造一個別名,其好處在於若要把function當做一參數傳入另外一fumcti

基礎 Linux(UNIX-Like) 指令(Command line)整理介紹

圖片
什麼是Command line? 就是常常我們看電影中,駭客對著一個沒有圖且畫面全黑的電腦打著滿滿文字,看起來很帥的那個。   (翻攝於youtube) 阿不對放錯圖了XD,應該是這張才對   (電影 ALGORITHM: The Hacker Movie中照片) 那個輸入的視窗,在 windows 中稱為 命令提示字元(cmd) ;在 Linux 中則稱為 終端機(terminal) 。至於輸入的那些指令則稱為 command line (cl)。 這些指令其實是呼叫一些現成寫好的程式,因此若能善用這些指令,有時候可以省去很多不必要的碼農時間。 這邊提供了一些基本但重要且常用的Linux指令(windows的與linux大不相同),介紹其常用的功能,若想知道該指令更多細節與參數,可以善用man 或者 --help指令進行查詢,例如: $ man cat $ cat --help 就能得到更多的細節拉~ 在開始介紹指令以前,先講解一下指令的 參數(option) 。 一般而言參數可以分為 長參數(long option) 與 短參數(short option) 。 長參數:在使用時常用' -- '作為參數開始,並且是一串具有意義的單字,較具有可讀性,缺點則是過長。例如--help --all或者--recursive。 短參數:在使用時都用' - '作為參數開始,接著使用一個英文字母來表示,通常是某個單字的其中一個字母。例如-a -l或者-r之類的。 另外 短參數可以合併在一起使用 ,例如: $ ls -la 和 $ ls -l -a 就是一樣的東西。更加詳細的原理可以參考getopt_long()。 以下開始介紹各個常用指令,有黃底的代表筆者認為非常重要一定要熟悉的指令。 cat (con cat enate) 🐱 <用處> 印出檔案內容或將多個 檔案合併 。 <語法> cat [OPTION]... [FILE]... <說明> 此語法多用於將文字檔案內容印在terminal上。實際上該指令是將檔案內容連結(複製)至另一端,在沒有指定目標的情況下,會將檔案連結至standard output,即印在terminal上。

在linux下用C實作netstat (Implement netstat)

圖片
在Linux 下, netstat 指令常被用來查詢網路各種資訊,像是 在TCP、UDP、IP  ethernet 和 socket 中的各種資訊。 至於 netstat 則是去/proc中抓取各個所需要的資料。  /proc是系統模擬出來、假的(虛擬)檔案系統(pseudo-filesystem),它是外界讀取核心資訊的對外窗口 。 說是假的檔案系統是因為/proc中每個檔案在當user-process讀取/proc下的檔案時,才會即時(real-time)產生檔案中的「內容」。   以下 是Linux Programmer's Manual 中對於proc的描述 : The proc filesystem is a pseudo-filesystem which provides an interface to kernel data structures. from man proc 在/proc 這個目錄下,可以分為兩種類型的檔案:一種是只有數字編號的目錄,其代表每個執行中的Process 的ID (i.e. pid); 另一種非數字編號的則是與系統資訊相關的檔案。 在這個實作中我們需要使用到的是 /proc/net,該目錄下儲存著各種網路層的資訊。其中的/tpc與/udp分別儲存著tpc socket table與udp socket。 當我們對其中一個(udp) 貓一下( cat 指令)後,會出現如下的表格: 在這些欄位中,我們所需要的分別是 local_address 、 rem_address 與 inode 。 其中inode在這裡所代表 的意義很重要, 因為 使用該 addr :port的process 會 link到該inode 。講到這邊 大概就 已經講完所有原理了,最後只要找到 link到所有inode 的process就能完成了。 至於這個link要去哪裡找呢? 這就要 去 /proc 目錄下所有的數字目錄中的/ fd( f ile d escriptors)目錄 去慢慢找,即 /proc/[pid]/fd/ ,找到 所有symbolic link 到 inode 的 pid 。 例如我現找到一pid=878的process符合此條件(絕對剛好是87的),於是在/proc/878