本文將爲你們介紹鴻蒙輕內核中的進程、線程、內存和網絡四大基礎功能,包括一些基礎概念、實現功能和使用場景等,供想要深刻了解鴻蒙操做系統的初學者學習參考。git
1、進程
基本概念
從系統的角度看,進程是資源管理單元。進程可使用或等待CPU、使用內存空間等系統資源,並獨立於其它進程運行。安全
OpenHarmony內核的進程模塊能夠給用戶提供多個進程,實現了進程之間的切換和通訊,幫助用戶管理業務程序流程。這樣用戶能夠將更多的精力投入到業務功能的實現中。網絡
OpenHarmony內核中的進程採用搶佔式調度機制,支持時間片輪轉調度方式和FIFO調度機制。dom
OpenHarmony內核的進程一共有32個優先級(0-31),用戶進程可配置的優先級有22個(10-31),最高優先級爲10,最低優先級爲31。異步
高優先級的進程可搶佔低優先級進程,低優先級進程必須在高優先級進程阻塞或結束後才能獲得調度。socket
每個用戶態進程均擁有本身獨立的進程空間,相互之間不可見,實現進程間隔離。函數
用戶態根進程Init由內核態建立,其它用戶態進程均由Init進程fork而來。post
進程狀態說明:性能
-
初始化(Init):該進程正在被建立。學習
-
就緒(Ready):該進程在就緒列表中,等待CPU調度。
-
運行(Running):該進程正在運行。
-
阻塞(Pend):該進程被阻塞掛起。本進程內全部的線程均被阻塞時,進程被阻塞掛起。
-
殭屍態(Zombies):該進程運行結束,等待父進程回收其控制塊資源。
圖 1 進程狀態遷移示意圖
進程狀態遷移說明:
-
Init→Ready:
進程建立或fork時,拿到該進程控制塊後進入Init狀態,處於進程初始化階段,當進程初始化完成將進程插入調度隊列,此時進程進入就緒狀態。
-
Ready→Running:
進程建立後進入就緒態,發生進程切換時,就緒列表中最高優先級的進程被執行,從而進入運行態。若此時該進程中已無其它線程處於就緒態,則該進程從就緒列表刪除,只處於運行態;若此時該進程中還有其它線程處於就緒態,則該進程依舊在就緒隊列,此時進程的就緒態和運行態共存。
-
Running→Pend:
進程內全部的線程均處於阻塞態時,進程在最後一個線程轉爲阻塞態時,同步進入阻塞態,而後發生進程切換。
-
Pend→Ready / Pend→Running:
阻塞進程內的任意線程恢復就緒態時,進程被加入到就緒隊列,同步轉爲就緒態,若此時發生進程切換,則進程狀態由就緒態轉爲運行態。
-
Ready→Pend:
進程內的最後一個就緒態線程處於阻塞態時,進程從就緒列表中刪除,進程由就緒態轉爲阻塞態。
-
Running→Ready:
進程由運行態轉爲就緒態的狀況有如下兩種:
- 有更高優先級的進程建立或者恢復後,會發生進程調度,此刻就緒列表中最高優先級進程變爲運行態,那麼原先運行的進程由運行態變爲就緒態。
- 若進程的調度策略爲SCHED_RR,且存在同一優先級的另外一個進程處於就緒態,則該進程的時間片消耗光以後,該進程由運行態轉爲就緒態,另外一個同優先級的進程由就緒態轉爲運行態。
-
Running→Zombies:
當進程的主線程或全部線程運行結束後,進程由運行態轉爲殭屍態,等待父進程回收資源。
使用場景
進程建立後,用戶只能操做本身進程空間的資源,沒法操做其它進程的資源(共享資源除外)。 用戶態容許進程掛起,恢復,延時等操做,同時也能夠設置用戶態進程調度優先級和調度策略,獲取進程調度優先級和調度策略。進程結束的時候,進程會主動釋放持有的進程資源,但持有的進程pid資源須要父進程經過wait/waitpid或父進程退出時回收。
功能
OpenHarmony內核系統中的進程管理模塊爲用戶提供下面幾種功能:
表 1 進程管理模塊功能
功能分類 |
接口名 |
描述 |
備註 |
---|---|---|---|
進程 |
fork |
建立一個新進程。 |
- |
exit |
終止進程。 |
- |
|
atexit |
註冊正常進程終止的回調函數。 |
- |
|
abort |
停止進程執行。 |
- |
|
getpid |
獲取進程ID。 |
- |
|
getppid |
獲取父進程ID。 |
- |
|
getpgrp |
獲取調用進程的進程組ID。 |
- |
|
getpgid |
獲取進程的進程組ID。 |
- |
|
setpgrp |
設置調用進程的進程組ID。 |
- |
|
setpgid |
設置進程的進程組ID。 |
- |
|
kill |
給進程發送信號。 |
|
|
wait |
等待任意子進程結束並回收子進程資源。 |
status的值能夠由如下宏定義解析:
|
|
waitpid |
等待子進程結束並回收子進程資源。 |
options:不支持WUNTRACED,WCONTINUED; status的值能夠由如下宏定義解析:
|
|
調度 |
getpriority |
獲取指定ID的靜態優先級。 |
|
setpriority |
設置指定ID的靜態優先級。 |
||
sched_rr_get_interval |
獲取執行時間限制。 |
- |
|
sched_yield |
系統調用運行進程主動讓出執行權。 |
- |
|
sched_get_priority_max |
獲取進程靜態優先級取值範圍的最大值。 |
調度策略只支持:SCHED_FIFO 、SCHED_RR。 |
|
sched_get_priority_min |
獲取進程靜態優先級取值範圍的最小值。 |
||
sched_getscheduler |
獲取調度策略。 |
||
sched_setscheduler |
設置調度策略。 |
||
sched_getparam |
獲取調度參數。 |
- |
|
sched_setparam |
設置調度參數。 |
- |
|
exec |
execl |
執行指定的elf格式的用戶程序文件。 |
- |
execle |
執行指定的elf格式的用戶程序文件。 |
- |
|
execlp |
執行指定的elf格式的用戶程序文件。 |
- |
|
execv |
執行指定的elf格式的用戶程序文件。 |
- |
|
execve |
執行指定的elf格式的用戶程序文件。 |
- |
|
execvp |
執行指定的elf格式的用戶程序文件。 |
- |
2、線程
基本概念
從系統的角度看,線程是競爭系統資源的最小運行單元。線程可使用或等待CPU、使用內存空間等系統資源,並獨立於其它線程運行。
OpenHarmony內核每一個進程內的線程獨立運行、獨立調度,當前進程內線程的調度不受其它進程內線程的影響。
OpenHarmony內核中的線程採用搶佔式調度機制,同時支持時間片輪轉調度和FIFO調度方式。
OpenHarmony內核的線程一共有32個優先級(0-31),最高優先級爲0,最低優先級爲31。
當前進程內高優先級的線程可搶佔當前進程內低優先級線程,當前進程內低優先級線程必須在當前進程內高優先級線程阻塞或結束後才能獲得調度。
線程狀態說明:
-
初始化(Init):該線程正在被建立。
-
就緒(Ready):該線程在就緒列表中,等待CPU調度。
-
運行(Running):該線程正在運行。
-
阻塞(Blocked):該線程被阻塞掛起。Blocked狀態包括:pend(由於鎖、事件、信號量等阻塞)、suspend(主動pend)、delay(延時阻塞)、pendtime(由於鎖、事件、信號量時間等超時等待)。
-
退出(Exit):該線程運行結束,等待父線程回收其控制塊資源。
圖 1 線程狀態遷移示意圖
線程狀態遷移說明:
-
Init→Ready:
線程建立拿到控制塊後爲Init狀態,處於線程初始化階段,當線程初始化完成將線程插入調度隊列,此時線程進入就緒狀態。
-
Ready→Running:
線程建立後進入就緒態,發生線程切換時,就緒列表中最高優先級的線程被執行,從而進入運行態,但此刻該線程會從就緒列表中刪除。
-
Running→Blocked:
正在運行的線程發生阻塞(掛起、延時、讀信號量等)時,該線程會從就緒列表中刪除,線程狀態由運行態變成阻塞態,而後發生線程切換,運行就緒列表中剩餘最高優先級線程。
-
Blocked→Ready / Blocked→Running:
阻塞的線程被恢復後(線程恢復、延時時間超時、讀信號量超時或讀到信號量等),此時被恢復的線程會被加入就緒列表,從而由阻塞態變成就緒態;此時若是被恢復線程的優先級高於正在運行線程的優先級,則會發生線程切換,將該線程由就緒態變成運行態。
-
Ready→Blocked:
線程也有可能在就緒態時被阻塞(掛起),此時線程狀態會由就緒態轉變爲阻塞態,該線程從就緒列表中刪除,不會參與線程調度,直到該線程被恢復。
-
Running→Ready:
有更高優先級線程建立或者恢復後,會發生線程調度,此刻就緒列表中最高優先級線程變爲運行態,那麼原先運行的線程由運行態變爲就緒態,並加入就緒列表中。
-
Running→Exit:
運行中的線程運行結束,線程狀態由運行態變爲退出態。若未設置分離屬性(PTHREAD_CREATE_DETACHED)的線程,運行結束後對外呈現的是Exit狀態,即退出態。
-
Blocked→Exit:
阻塞的線程調用刪除接口,線程狀態由阻塞態變爲退出態。
使用場景
線程建立後,用戶態能夠執行線程調度、掛起、恢復、延時等操做,同時也能夠設置線程優先級和調度策略,獲取線程優先級和調度策略。
功能
OpenHarmony內核系統中的線程管理模塊,線程間通訊爲用戶提供下面幾種功能:
表 1 線程管理模塊功能
頭文件 |
名稱 |
說明 |
備註 |
---|---|---|---|
pthread.h |
pthread_attr_destroy |
銷燬線程屬性對象。 |
- |
pthread.h |
pthread_attr_getinheritsched |
獲取線程屬性對象的調度屬性。 |
- |
pthread.h |
pthread_attr_getschedparam |
獲取線程屬性對象的調度參數屬性。 |
- |
pthread.h |
pthread_attr_getschedpolicy |
獲取線程屬性對象的調度策略屬性。 |
OpenHarmony:支持SCHED_FIFO 、SCHED_RR調度策略。 |
pthread.h |
pthread_attr_getstacksize |
獲取線程屬性對象的堆棧大小。 |
- |
pthread.h |
pthread_attr_init |
初始化線程屬性對象。 |
- |
pthread.h |
pthread_attr_setdetachstate |
設置線程屬性對象的分離狀態。 |
- |
pthread.h |
pthread_attr_setinheritsched |
設置線程屬性對象的繼承調度屬性。 |
- |
pthread.h |
pthread_attr_setschedparam |
設置線程屬性對象的調度參數屬性。 |
OpenHarmony:設置線程優先級的參數值越小,線程在系統中的優先級越高;設置參數值越大,優先級越低。 注意:須要將pthread_attr_t線程屬性的inheritsched字段設置爲PTHREAD_EXPLICIT_SCHED,不然設置的線程調度優先級將不會生效,系統默認設置爲PTHREAD_INHERIT_SCHED。 |
pthread.h |
pthread_attr_setschedpolicy |
設置線程屬性對象的調度策略屬性。 |
OpenHarmony:支持SCHED_FIFO 、SCHED_RR調度策略。 |
pthread.h |
pthread_attr_setstacksize |
設置線程屬性對象的堆棧大小。 |
- |
pthread.h |
pthread_getattr_np |
獲取已建立線程的屬性。 |
- |
pthread.h |
pthread_cancel |
向線程發送取消請求。 |
- |
pthread.h |
pthread_testcancel |
請求交付任何未決的取請求。 |
- |
pthread.h |
pthread_setcanceltype |
設置線程可取消類型。 |
- |
pthread.h |
pthread_setcancelstate |
設置線程可取消狀態。 |
- |
pthread.h |
pthread_create |
建立一個新的線程。 |
- |
pthread.h |
pthread_detach |
分離一個線程。 |
- |
pthread.h |
pthread_equal |
比較兩個線程ID是否相等。 |
- |
pthread.h |
pthread_exit |
終止正在調用的線程。 |
- |
pthread.h |
pthread_getschedparam |
獲取線程的調度策略和參數。 |
OpenHarmony:支持SCHED_FIFO 、SCHED_RR調度策略。 |
pthread.h |
pthread_join |
等待指定的線程結束。 |
- |
pthread.h |
pthread_self |
獲取當前線程的ID。 |
- |
pthread.h |
pthread_setschedprio |
設置線程的調度靜態優先級。 |
- |
pthread.h |
pthread_kill |
向線程發送信號。 |
- |
pthread.h |
pthread_once |
使函數調用只能執行一次。 |
- |
pthread.h |
pthread_atfork |
註冊fork的處理程序。 |
- |
pthread.h |
pthread_cleanup_pop |
刪除位於清理處理程序堆棧頂部的例程。 |
- |
pthread.h |
pthread_cleanup_push |
將例程推送到清理處理程序堆棧的頂部。 |
- |
pthread.h |
pthread_barrier_destroy |
銷燬屏障對象(高級實時線程) |
- |
pthread.h |
pthread_barrier_init |
初始化屏障對象(高級實時線程) |
- |
pthread.h |
pthread_barrier_wait |
屏障同步(高級實時線程) |
- |
pthread.h |
pthread_barrierattr_destroy |
銷燬屏障屬性對象。 |
- |
pthread.h |
pthread_barrierattr_init |
初始化屏障屬性對象。 |
- |
pthread.h |
pthread_mutex_destroy |
銷燬互斥鎖。 |
- |
pthread.h |
pthread_mutex_init |
初始化互斥鎖。 |
- |
pthread.h |
pthread_mutex_lock |
互斥鎖加鎖操做。 |
- |
pthread.h |
pthread_mutex_trylock |
互斥鎖嘗試加鎖操做。 |
- |
pthread.h |
pthread_mutex_unlock |
互斥鎖解鎖操做。 |
- |
pthread.h |
pthread_mutexattr_destroy |
銷燬互斥鎖屬性對象。 |
- |
pthread.h |
pthread_mutexattr_gettype |
獲取互斥鎖類型屬性。 |
- |
pthread.h |
pthread_mutexattr_init |
初始化互斥鎖屬性對象。 |
- |
pthread.h |
pthread_mutexattr_settype |
設置互斥鎖類型屬性。 |
- |
pthread.h |
pthread_mutex_timedlock |
使用超時鎖定互斥鎖。 |
- |
pthread.h |
pthread_rwlock_destroy |
銷燬讀寫鎖。 |
- |
pthread.h |
pthread_rwlock_init |
初始化讀寫鎖。 |
- |
pthread.h |
pthread_rwlock_rdlock |
獲取讀寫鎖讀鎖操做。 |
- |
pthread.h |
pthread_rwlock_timedrdlock |
使用超時鎖定讀寫鎖讀鎖。 |
- |
pthread.h |
pthread_rwlock_timedwrlock |
使用超時鎖定讀寫鎖寫鎖。 |
- |
pthread.h |
pthread_rwlock_tryrdlock |
嘗試獲取讀寫鎖讀鎖操做。 |
- |
pthread.h |
pthread_rwlock_trywrlock |
嘗試獲取讀寫鎖寫鎖操做。 |
- |
pthread.h |
pthread_rwlock_unlock |
讀寫鎖解鎖操做。 |
- |
pthread.h |
pthread_rwlock_wrlock |
獲取讀寫鎖寫鎖操做。 |
- |
pthread.h |
pthread_rwlockattr_destroy |
銷燬讀寫鎖屬性對象。 |
- |
pthread.h |
pthread_rwlockattr_init |
初始化讀寫鎖屬性對象。 |
- |
pthread.h |
pthread_cond_broadcast |
解除若干已被等待條件阻塞的線程。 |
- |
pthread.h |
pthread_cond_destroy |
銷燬條件變量。 |
- |
pthread.h |
pthread_cond_init |
初始化條件變量。 |
- |
pthread.h |
pthread_cond_signal |
解除被阻塞的線程。 |
- |
pthread.h |
pthread_cond_timedwait |
定時等待條件。 |
- |
pthread.h |
pthread_cond_wait |
等待條件。 |
- |
semaphore.h |
sem_destroy |
銷燬指定的無名信號量。 |
- |
semaphore.h |
sem_getvalue |
得到指定信號量計數值。 |
- |
semaphore.h |
sem_init |
建立並初始化一個無名信號量。 |
- |
semaphore.h |
sem_post |
增長信號量計數。 |
- |
semaphore.h |
sem_timedwait |
獲取信號量,且有超時返回功能。 |
- |
semaphore.h |
sem_trywait |
嘗試獲取信號量。 |
- |
semaphore.h |
sem_wait |
獲取信號量。 |
- |
3、內存
基本概念
內存管理是開發過程當中必需要關注的重要過程,它包括內存的分配、使用和回收。
良好的內存管理對於提升軟件性能和可靠性有着十分重要的意義。
使用場景
針對用戶態開發,OpenHarmony內存提供了一套內存系統調用接口,支持內存的申請釋放、重映射、內存屬性的設置等,還有C庫的標準內存操做函數。
功能
表 1 標準C庫相關接口
頭文件 |
接口 |
功能 |
---|---|---|
strings.h |
int bcmp(const void *s1, const void *s2, size_t n) |
比較字節序列。 |
strings.h |
void bcopy(const void *src, void *dest, size_t n) |
拷貝字節序列。 |
strings.h |
void bzero(void *s, size_t n) |
寫入零值字節。 |
string.h |
void *memccpy(void *dest, const void *src, int c, size_t n) |
拷貝src 所指的內存內容前n 個字節到dest 所指的地址上。複製時檢查參數c 是否出現,如果則返回dest 中值爲c 的下一個字節地址。 |
string.h |
void *memchr(const void *s, int c, size_t n) |
在s所指內存的前n個字節中查找c。 |
string.h |
int memcmp(const void *s1, const void *s2, size_t n) |
內存比較。 |
string.h |
void *memcpy(void *dest, const void *src, size_t n) |
內存拷貝。 |
string.h |
void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) |
找到一個子串。 |
string.h |
void *memmove(void *dest, const void *src, size_t n) |
內存移動。 |
string.h |
void *mempcpy(void *dest, const void *src, size_t n) |
拷貝內存區域。 |
string.h |
void *memset(void *s, int c, size_t n) |
內存初始化。 |
stdlib.h |
void *malloc(size_t size) |
申請內存。 |
stdlib.h |
void *calloc(size_t nmemb, size_t size) |
申請內存並清零。 |
stdlib.h |
void *realloc(void *ptr, size_t size) |
重分配內存。 |
stdlib.h/malloc. |
void *valloc(size_t size) |
分配以頁對齊的內存。 |
stdlib.h |
void free(void *ptr) |
釋放內存。 |
malloc.h |
size_t malloc_usable_size(void *ptr) |
獲取從堆分配的內存塊的大小。 |
unistd.h |
int getpagesize(void) |
獲取頁面大小。 |
unistd.h |
void *sbrk(intptr_t increment) |
更改數據段大小。 |
差別接口詳細說明:
-
mmap
函數原型:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
**函數功能:**申請虛擬內存。
參數說明:
參數
描述
addr
用來請求使用某個特定的虛擬內存地址。若是取NULL,結果地址就將自動分配(這是推薦的作法),不然會下降程序的可移植性,由於不一樣系統的可用地址範圍不同。
length
內存段的大小。
prot
用於設置內存段的訪問權限,有以下權限:
- PROT_READ:容許讀該內存段。
- PROT_WRITE:容許寫該內存段。
- PROT_EXEC:容許執行該內存段。
- PROT_NONE:不能訪問。
flags
控制程序對內存段的改變所形成的影響,有以下屬性:
- MAP_PRIVATE:內存段私有,對它的修改值僅對本進程有效。
- MAP_SHARED:把對該內存段的修改保存到磁盤文件中。
fd
打開的文件描述符。
offset
用以改變經共享內存段訪問的文件中數據的起始偏移值。
說明: mmap與Linux實現差別詳見與Linux標準庫的差別章節。
返回值:
- 成功返回:虛擬內存地址,這地址是頁對齊。
- 失敗返回:(void *)-1。
-
munmap接口
函數原型:
int munmap(void *addr, size_t length);
**函數功能:**釋放虛擬內存。
參數說明:
參數
描述
addr
虛擬內存起始位置。
length
內存段的大小。
返回值:
- 成功返回0。
- 失敗返回-1。
-
mprotect接口
函數原型:
int mprotect(void *addr, size_t length, int prot);
**函數功能:**修改內存段的訪問權限。
參數說明:
參數
描述
addr
內存段起始地址,必須頁對齊;訪問權限異常,內核將直接拋異常,kill該進程,而不會產生SIGSEGV信號給當前進程。
length
內存段的大小。
prot
內存段的訪問權限,有以下定義:
- PROT_READ:容許讀該內存段。
- PROT_WRITE:容許寫該內存段。
- PROT_EXEC:容許執行該內存段。
- PROT_NONE:不能訪問。
返回值:
- 成功返回0。
- 失敗返回-1。
-
mremap接口
函數原型:
void *mremap(void *old_address, size_t old_size, size_t new_size, int flags, void new_address);
**函數功能:**從新映射虛擬內存地址。
參數說明:
參數
描述
old_address
須要擴大(或縮小)的內存段的原始地址。注意old_address必須是頁對齊。
old_size
內存段的原始大小。
new_size
新內存段的大小。
flags
若是沒有足夠的空間在當前位置展開映射,則返回失敗
- MREMAP_MAYMOVE:容許內核將映射重定位到新的虛擬地址。
- MREMAP_FIXED:mremap()接受第五個參數,void *new_address,該參數指定映射地址必須頁對齊;在new_address和new_size指定的地址範圍內的全部先前映射都被解除映射。若是指定了MREMAP_FIXED,還必須指定MREMAP_MAYMOVE。
返回值:
- 成功返回:從新映射後的虛擬內存地址。
- 失敗返回:((void *)-1)。
4、網絡
基本概念
網絡模塊實現了TCP/IP協議棧基本功能,提供標準的POSIX socket接口。
說明: 當前系統使用lwIP提供網絡能力。
使用場景
針對用戶態開發,OpenHarmony內核提供了一套網絡功能系統調用接口,支持socket的建立關閉、數據收發、網絡屬性的設置等,經過C庫提供標準的POSIX socket函數供開發者使用。
功能
表 1 標準C庫相關接口
頭文件 |
接口 |
功能 |
---|---|---|
sys/socket.h |
int accept(int socket, struct sockaddr *address, socklen_t *address_len) |
接受鏈接。 |
sys/socket.h |
int bind(int s, const struct sockaddr *name, socklen_t namelen) |
socket與IP地址綁定。 |
sys/socket.h |
int shutdown(int socket, int how) |
關閉鏈接。 |
sys/socket.h |
int getpeername(int s, struct sockaddr *name, socklen_t *namelen) |
獲取對端地址。 |
sys/socket.h |
int getsockname(int s, struct sockaddr *name, socklen_t *namelen) |
獲取本地地址。 |
sys/socket.h |
int getsockopt(int s, struct sockaddr *name, socklen_t *namelen) |
獲取socket屬性信息。 |
sys/socket.h |
int setsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen) |
配置socket屬性。 |
unistd.h |
int close(int s) |
關閉socket。 |
sys/socket.h |
int connect(int s, const struct sockaddr *name, socklen_t namelen) |
鏈接到指定的目的IP。 |
sys/socket.h |
int listen(int sockfd, int backlog) |
listen鏈接本socket的請求。 |
sys/socket.h |
ssize_t recv(int socket, void *buffer, size_t length, int flags) |
接收socket上收到的數據。 |
sys/socket.h |
ssize_t recvmsg(int s, struct msghdr *message, int flags) |
接收socket上收到的數據,可以使用更豐富的參數。 |
sys/socket.h |
ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len) |
接收socket上收到的數據,可同時得到數據來源IP地址。 |
sys/socket.h |
ssize_t send(int s, const void *dataptr, size_t size, int flags) |
經過socket發送數據。 |
sys/socket.h |
ssize_t sendmsg(int s, const struct msghdr *message, int flags) |
經過socket發送數據,可以使用更豐富的參數。 |
sys/socket.h |
ssize_t sendto(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen) |
經過socket發送數據,可指定發送的目的IP地址。 |
sys/socket.h |
int socket(int domain, int type, int protocol) |
建立socket。 |
sys/select.h |
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) |
多路複用。 |
sys/ioctl.h |
int ioctl(int s, int request, ...) |
socket屬性獲取、設置。 |
arpa/inet.h |
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) |
網絡地址格式轉換:將二進制格式IP地址轉換爲字符串格式。 |
arpa/inet.h |
int inet_pton(int af, const char *src, void *dst) |
網絡地址格式轉換:將字符串格式IP地址轉換爲二進制格式。 |
與標準接口差別詳細說明:
-
sendmsg
函數原型:
ssize_t sendmsg(int s, const struct msghdr *message, int flags)
**函數功能:**發送消息。
參數說明:
參數
描述
s
套接字。
message
待發送的消息,不支持發送ancillary消息。
flags
用於指定發送消息時行爲特性,有以下行爲特性:
- MSG_MORE:容許將屢次發送的消息進行拼包發送。
- MSG_DONTWAIT:非阻塞操做。
返回值:
- 成功返回:已發送的消息長度(字節數)。
- 失敗返回:-1,並設置errno。
-
recvmsg
函數原型:
ssize_t recvmsg(int s, struct msghdr *message, int flags)
**函數功能:**接收消息。
參數說明:
參數
描述
s
套接字。
message
存放接收的消息,不支持接收ancillary消息。
flags
用於指定接收消息時行爲特性,有以下行爲特性:
- MSG_PEEK:容許預讀消息而不取走。
- MSG_DONTWAIT:非阻塞操做。
返回值:
- 成功返回:已接收的消息長度(字節數)。
- 失敗返回:-1,並設置errno。
-
ioctl
函數原型:
int ioctl(int s, int request, ...)
**函數功能:**獲取或設置socket屬性。
參數說明:
參數
描述
s
套接字
request
對socket屬性要進行的操做,當前支持以下操做:
- FIONREAD:獲取socket當前可讀取的數據大小(字節數)。
- FIONBIO:設置socket是否非阻塞。
返回值:
- 成功返回:0。
- 失敗返回:-1,並設置errno。
更多詳情請查看:點擊查看