原创 Linux 程序運行棧幀

我們知道C語言中,每個棧幀對應着一個未運行完的函數。棧幀中保存了該函數的返回地址和局部變量。棧幀也叫過程活動記錄,是編譯器用來實現函數調用的一種數據結構。那麼在Linux下gcc編譯器棧幀是怎麼實現的呢? 首先先來看一段程序: 猜

原创 Linux進程管理之task_struct

大家都知道進程,可是知道linux是怎麼管理其進程的嗎?每一個進程都有一個進程描述符,具體是task_struct結構體存儲相關的信息,在linux/sched.h文件裏定義,那麼我們先看看linux內核3.0版本的task_struct

原创 可重入函數與線程安全

若一個程序或子程序可以“安全的被並行執行(Parallel computing)”,則稱其爲可重入(reentrant或re-entrant)的。即當該子程序正在運行時,可以再次進入並執行它(並行執行時,個別的執行結果,都符合設計時的預

原创 select、poll、epoll的區別

I/O多路轉接之select     系統提供select函數來實現多路複用輸入/輸出模型。select系統調用是用來讓我們的程序監視多個文件句柄的狀態變化的。程序會停在select這裏等待,直到被監視的文件句柄有一個或多個發生了狀態改變

原创 Linux進程創建函數vfork簡介

基礎知識 vfork和fork的區別和聯繫 vfork用於創建一個新進程,而該新進程的目的是exec一個新程序。vfork與fork都創建一 個子進程,但它不將父進程的地址空間複製到子進程中, 因爲子進程會立即調用 exec,於是不會存

原创 Linux進程通信(三)IPC信號

信號量的本質是一種數據操作鎖,它本身不具有數據交換的功能,而是通過控制其他的通信資源(文件,外部設備)來實現進程間通信,它本身只是一種外部資源的標識。信號量在此過程中負責數據操作的互斥、同步等功能。    當請求一個使用信號量來表示的資

原创 socket編程之簡單的TCP服務器

一、socket編程     socket編程socket這個詞可以表示很多概念: 在TCP/IP協議中,“IP地址+TCP或UDP端口號”唯一標識網絡通訊中的一個進程,“IP地址+端口號”就稱爲socket。     在TCP協議中,建

原创 LInux 子進程創建函數fork簡介

 一、fork入門知識 一個進程,包括代碼、數據和分配給進程的資源。fork()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個進程也可以做不同的事。 調用成

原创 最詳細的紅黑樹解析

紅黑樹 紅黑樹(英語:Red–black tree)是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組。它是在1972年由魯道夫·貝爾發明的,他稱之爲"對稱二叉B樹",它現代的名字是在Le

原创 操作系統中常見的進程調度算法

一、先來先服務(FCFS)和短作業(SJF)優先調度算法 1.先來先服務(first-come first-sereved,FCFS)調度算法 先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度,也可

原创 TCP傳輸控制協議

一、 TCP協議       TCP是一種面向連接(連接導向)的、可靠的基於字節流的傳輸層通信協議。TCP將用戶數據打包成報文段,它發送後啓動一個定時器,另一端收到的數據進行確認、對失序的數據重新排序、丟棄重複數據。 TCP的特點有

原创 如何將你的vim配置的“高大上”

vim對於一個經常在linux進行編程的程序員,將vim 配置的高大上是一個程序員的基本素養。接下來就來給大家介紹一下如何簡單的配置vim首先來上一張效果圖配置文件的位置    在目錄 /etc/ 下面,有個名爲vimrc的文件,這是系統

原创 ctags 和Makefile的簡單使用

ctagsctags是vim下方便代碼閱讀的工具。儘管ctags也可以支持其它編輯器,但是它正式支持的只有VIM。並且VIM中已經默認安裝了Ctags,它可以幫助程序員很容易地瀏覽源代碼。(尤其是大型的工程)一、安裝ctags1、命令行安

原创 如何定義一個只能在堆上(棧上)生成對象的類?

類的對象的生成 在C++中,類的對象建立分爲兩種,一種是靜態建立,如A a;另一種是動態建立,如A* ptr=new A;這兩種方式是有區別的。 靜態建立一個類對象,是由編譯器爲對象在棧空間中分配內存,是通過直接移動棧頂指針,挪出適

原创 Linux進程通信(二)IPC消息隊列

一、什麼是消息隊列 消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。每個數據塊都被認爲含有一個類型,接收進程可以獨立地接收含有不同類型的數據結構。我們可以通過發送消息來避免命名管道的同步和阻塞問題。但是消息隊列與命名管道一樣