原创 Posix共享內存區

Posix提供了兩種在無親緣關係進程間共享內存區的方法: (1)內存映射文件:先有open函數打開,然後調用mmap函數把得到的描述符映射到當前進程地址空間中的一個文件(上一篇筆記所用到的就是)。 (2)共享內存區對象:先有shm_

原创 信號量

一、信號量分類 (1)Posix有名信號量,可用於進程和同一進程不同線程間同步 (2)​Posix基於內存的信號量,存放在共享內存區中,可用於進程和同一進程不同線程間同步 (3)System V信號量​,在內核中維護,可用於進程和

原创 TCP定時器

TCP爲每條連接建立七個定時器:1、  連接建立定時器在發送SYN報文段建立一條新連接時啓動。如果沒有在75秒內收到響 應,連接建立將中止。當TCP實例將其狀態從LISTEN更改爲SYN_RECV的時侯就會使用這一計時器.服務端的TCP實

原创 select、poll和epoll

1、select的描述符大於FD_SETSIZE(1024)時會引起內存越界,poll和epoll不會,雖然連接數有上限,但是很大,1G內存的機器上可以打開10萬左右的連接,2G內存的機器可以打開20萬左右的連接2、epoll是Linux

原创 System V共享內存

System V 與Posix 共享內存區 二者的差別是: (1)Posix共享內存區是先調用shm_open然後再調用mmap,System V 共享內存區是先調用shmget再調用shmat。 (2)Posix共享內存區對象的

原创 Gobject之signal

GObject 信號(Signal)主要用於特定事件與響應者之間的連接,它與操作系統級中的信號沒有什麼關係。 一般在class_init時,由g_signal_new生成一個新信號句柄並綁定回調函數,也可以使用g_signal_conne

原创 靜態鏈接

一、在Linux下一個程序的編譯過程可分爲:預編譯、編譯、彙編、鏈接。1、預編譯gcc -E hello.c -o hello.i預編譯過程注意處理那些源代碼文件中的以#開始的預編譯指令。比如“#include”“#define”“#if

原创 深入探索C++對象模型

一、C++對象模型中nostatic data member被置於每一個class object中,static data member、static function member和nostatic function member都被存

原创 互斥鎖和條件變量

1、互斥鎖互斥鎖APIpthread_mutex_lock(pthread_mutex_t *mutex); 用此函數加鎖時,如果mutex已經被鎖住,當前嘗試加鎖的線程就會阻塞,直到互斥鎖被其他線程釋放。當此函數返回時,說明互斥鎖已經被

原创 C++編寫動態庫.so或者.dll的陷阱

一、接口不變就可以不需要重新編譯? 對於很多庫的實現者可能會有這樣的認識“接口不變就可以不需要重新編譯”,其實這句話是有前提的,前提是實現的動態庫有足夠的兼容性和魯棒性。尤其是C++實現的動態庫,C++只對語言層規則做了規定,沒有二進制級

原创 消息隊列

一、Posix消息隊列 ​1、mq_open,mq_close,mq_unlink  #include <mqueue.h> mqd_t mq_open(const char *name, int oflag, ...); of

原创 動態鏈接

一、靜態鏈接缺陷 靜態鏈接需要把數據和代碼都連接到自己的可執行文件中,運行時系統中有時會存在多個庫文件副本從而容易造成內存和磁盤的空間浪費、其次靜態鏈接模塊更新困難。爲了解決這兩個問題需要把程序的模塊分隔開,生成相互獨立的文件從而不在

原创 GTK的非實例化類型-interface

本節將介紹接口背後的理論。 如何定義和實現接口詳見 How to define and implement interfaces章節。 GType的接口非常類似於Java的接口。 它們允許設計一個通用接口,幾個類將遵循這個接口。想象一下,

原创 裝載和動態鏈接

一、進程虛擬地址空間1、程序是一個靜態的概念,他是一些預編譯好的指令數據集合的一個文件。進程是一個動態的概念是一個程序運行時的過程。​每個進程都有自己獨立的虛擬地址空間,虛擬地址空間的大小有硬件平臺決定,具體說是CPU位數決定的,32位的

原创 C++順序容器

標準庫定義了三種順序容器類型:verctor、list、deque(雙端隊列)verctor:支持快速隨機訪問。list:支持快速插入​刪除。deque:雙端隊列1、容器構造函數容器構造函數將一個容器複製給另一個容器時類型必須匹配,容器類