Unix Linux下C C 開發技術概覽2

2021-05-27 06:01:39 字數 4276 閱讀 8994

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...