1.3 圖形使用者介面
windows 和unix 圖形模型差異極大,這點是unix和windows程式開發最大的差別。unix 使用x window 系統gui,而windows 使用gdi。雖然在概念上類似,但是x api 和gdi api 之間沒有簡單的對應。在windows下面可以通過mfc等類庫很方便的開發出圖形使用者介面的程式,而unix下相對來說就麻煩了些,缺少哪種所見即所得的好的開發工具。unix下的gui程式開發,是乙個比較複雜的過程,這裡就不在詳細介紹。如果要進行unix下面gui程式的開發的話,可以單獨去查詢相關的文件。
1.4 併發處理
併發處理包括多程序和多執行緒的概念,windows和unix的併發處理差別也比較大,但是基本上都能找到一組對應的函式來實現類似的功能。
在windows下,建立程序和執行緒可以通過呼叫windows的api來完成,或者通過呼叫mfc提供的併發處理類庫來實現。在unix下面建立程序通常使用fork函式,這跟windows下面的多程序概念有所不同,相當於在當前位置給當前程序建立乙個副本;而windows下的建立程序大都是建立乙個新的程序。unix下的多執行緒操作,通過一組執行緒函式來完成,通常我們使用posix 的pthread執行緒庫來建立執行緒,但是在不同的unix分支系統中,都包含又自己的本地執行緒庫。如在solaris下面的本地執行緒庫,是一組以thr_開頭的函式,而posix的執行緒函式一般都已pthread_開頭。雖然有兩種不同的執行緒庫空我們選擇,但在某乙個特定的系統下,他們的實現實質都是一樣的,而且基本上都能夠找到對應的函式。為了程式的可移植性,建議採用posix的執行緒庫。這是大多數unix系統都支援的執行緒庫,但是不同系統下實現的功能可能有所差別,可能只是實現了這個函式庫的乙個子集。
在有些unix系統下,沒有實現執行緒庫,如sco unix,系統只提供多程序的開發方式。但是,如果為了實現程式**的統一性,我們可以採用第三方提供的執行緒庫。這裡有乙個叫fsu-threads的執行緒庫供我們選擇。這個執行緒庫中實現了posix中定義的執行緒函式,而且是開源的,可以支援sunos 4.1.x, solaris 2.x, sco unix, freebsd, linux
等系統。除此之外,還有zthreads執行緒庫等。
在windows的執行緒庫中,實現了互斥(mutex)、事件(event)、訊號量(semaphore)等同步物件,用於實現執行緒之間的同步。在unix下面,執行緒同步主要使用互斥(mutex)和條件變數(cond),其中條件變數可以實現事件和訊號量的功能。另外, posix還定義了一套訊號量函式,跟執行緒函式不同,是一組以sem_開頭的函式(posix 1003.1b semaphores)。但是這套函式就不想posix執行緒函式支援的那麼廣泛了,比如在aix上就不支援posix的訊號量函式,不過aix系統下有另一組函式來實現訊號量的功能(systemv semaphores)。在很多unix系統中,同時支援posix的訊號量和systemv的訊號量,在solaris下面還有一套自己的本地函式來實現訊號量。下面分別列出unix系統中的用於併發處理的主要的函式。
程序fork 建立程序
posix執行緒庫
pthread_create 建立乙個信的執行緒
pthread_attr_init 初始化乙個執行緒屬性物件
pthread_attr_destroy 釋放乙個執行緒屬性物件
pthread_exit 終止執行呼叫的執行緒
pthread_join 把當前呼叫執行緒掛起,直到目標執行緒結束
pthread_setschedparam 設定執行緒的排程策略和優先順序
pthread_getschedparam 獲得執行緒的排程策略和優先順序
pthread_sigmask 改變/檢查呼叫執行緒的訊號掩碼
pthread_kill 傳送訊號到另乙個執行緒
pthread_self 返回當前執行緒的id
pthead_mutex_init 初始化乙個互斥量
pthread_mutexattr_init 初始化互斥量的屬性物件
pthread_mutex_lock 給乙個互斥量加鎖,如果互斥量已經被別的執行緒鎖定,呼叫執行緒掛起,直到別的執行緒釋放
pthread_mutex_unlock 釋放互斥量(解鎖)
ptherad_mutex_destroy 銷毀乙個互斥量
pthread_cond_init 初始化乙個條件變數
pthread_condattr_init 初始化乙個條件變數的屬性物件
pthread_cond_wait 阻塞在乙個條件變數上
pthread_cond_signal 解除下乙個執行緒在條件變數的阻塞
pthread_cond_boradcast 解除所有執行緒在這個條件變數上的阻塞
pthread_cond_destroy 銷毀乙個條件變數
pthread_cancel 請求結束乙個執行緒
solaris本地執行緒庫
thr_create 建立乙個新執行緒
thr_exit 終止呼叫執行緒
thr_join 把當前呼叫執行緒掛起,直到目標執行緒結束
thr_yield 用當前執行緒建立出另乙個執行緒
thr_suspend 掛起乙個指定的執行緒
thr_continue 恢復乙個被掛起的執行緒
thr_setprio 修改執行緒的優先順序
thr_getprio 獲得執行緒的優先順序
thr_sigsetmask 改變/檢查呼叫執行緒的訊號掩碼
thr_kill 傳送訊號到另乙個執行緒
thr_self 返回當前執行緒的id
thr_main 標記為主執行緒
thr_mutex_init 初始化乙個互斥量
thr_mutex_lock 給乙個互斥量加鎖,如果互斥量已經被別的執行緒鎖定,呼叫執行緒掛起,直到別的執行緒釋放
thr_mutex_unlock 釋放互斥量(解鎖)
thr_mutex_destroy 銷毀乙個條互斥量
thr_cond_init 初始化乙個條件變數
thr_cond_wait 阻塞在乙個條件變數上
thr_cond_signal 解除下乙個執行緒在條件變數的阻塞
thr_cond_boradcast 解除所有執行緒在這個條件變數上的阻塞
thr_cond_destroy 銷毀任何狀態的條件變數
rwlock_init 初始化乙個讀寫鎖
rw_rdlock 獲得乙個讀寫鎖的讀鎖定
rw_wrlock 獲得乙個讀寫鎖的寫鎖定
rw_unlock 解鎖乙個讀寫鎖
posix訊號量
sem_init 初始化乙個訊號量
sem_destroy 銷毀乙個訊號量
sem_wait 等待獲得乙個訊號量,獲得後訊號量的值減1,如果當前訊號量值位0,當前執行緒阻塞,支援有別的執行緒釋放訊號量
sem_trywait 嘗試獲得乙個訊號量,獲得後訊號量的值減1,如果當前訊號量值位0,返回失敗
sem_post 釋放乙個訊號量
sem_getvalue 獲得指定訊號量的值
system v訊號量
semctl 對訊號量進行一系列的控制
semget 建立乙個訊號量,成功時返回訊號的id
semop 對訊號進行操作
solaris的本地訊號量,更接近於作業系統中我們學到的pv操作的訊號燈
sema_init 初始化乙個訊號燈(訊號量)
sema_destroy 銷毀乙個訊號燈
sema_p 執行訊號燈的p操作
sema_p_sig 跟sema_p類似,當阻塞再這個函式的時候,如果執行緒收到乙個訊號,函式退出
sema_tryp 嘗試執行訊號燈的p操作
sema_v 執行訊號燈的v操作
為了方便使用,我在開發的過程中已經把上面常用的函式都封裝成了類,相容windows和各種常見的unix系統,而且網上還有很多這方面的**資源可用。如果感興趣的話可以向我索要。
1.5 網路通訊
socket(中文譯名:套接字)最初在unix上出現,並很快成為unix上最流行的網路程式設計介面之一。後來,微軟將它引入到windows中並得到實現,於是從windows 95、winnt4開始,系統就內建了winsock1.1,後來到了windows98、windows2000,它內建的winsock dll更新為winsock2.2。
windows下的socket函式大體上和unix下的socket函式差不多,函式名稱很引數用法都類似,只有一些細微的差別,某些引數的意義不同,而且對於socket的屬性控制也不太一樣。windows下面還對socket函式進行了封裝,有一系列相關類可用使用,簡化網路程式設計的複雜性。unix本身沒有這些類庫,但是我們也已經積累了很多這方面的經驗和資源。我們有一組現成的類對windows和unix下的socket函式進行了封裝,上層只需要簡單的呼叫即可,不用關心底層的差別。而且,這套類庫也可以同時支援多種平台,可移植性非常好。
UNIX LINUX下 M 的問題
unix和windows間的文字檔案轉換 在用電報通訊的年代,人們發明了一種用7bits把常用的英文和標點編碼的方法 這就是至今還在計算機世界應用的ascii。電報機每當列印到一行結尾時便需要 跳進下一行 並 回到第一格 因此ascii有lf line feed,0 0a 和cr carriage ...
C C 開發MySQL程式簡介 下
如果需要向資料庫中儲存blob資料,則不能單純的使用字串,因為blob資料中很可能含有0。一般有兩種方法用來儲存blob資料,乙個是通過mysql提供的轉義函式 unsigned long mysql real escape string mysql mysql,char to,const char...
CentOS下備置C C 開發環境
下面是介紹oracle的virtualbox虛擬機器 我是在win10環境下面安裝的,我安裝的時候更改了路徑,安裝完成後雙擊打不開。解決方法一 用360更新你的virtualbox到最新版本就可以開啟了。ubantu下下啟用root,給root設定密碼方法 1 開啟終端 2 輸入如下命令 3 sud...