鴻蒙輕內核四大基礎功能介紹

本文將爲你們介紹鴻蒙輕內核中的進程、線程、內存和網絡四大基礎功能,包括一些基礎概念、實現功能和使用場景等,供想要深刻了解鴻蒙操做系統的初學者學習參考。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:

    進程由運行態轉爲就緒態的狀況有如下兩種:

    1. 有更高優先級的進程建立或者恢復後,會發生進程調度,此刻就緒列表中最高優先級進程變爲運行態,那麼原先運行的進程由運行態變爲就緒態。
    2. 若進程的調度策略爲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

給進程發送信號。

  • 僅支持1-30號信號的發送。
  • 信號的默認行爲不支持STOP及CONTINUE,無COREDUMP功能。
  • 不能屏蔽SIGSTOP、SIGKILL、SIGCONT。
  • 異步信號,發送信號給某進程後,直到該進程被調度後纔會執行信號回調(爲安全起見,殺死進程的動做是進程本身執行的,內核不能經過信號強制殺死對方)。
  • 進程消亡會發送SIGCHLD給父進程,發送動做沒法取消。
  • 沒法經過信號喚醒正在睡眠的進程。

wait

等待任意子進程結束並回收子進程資源。

status的值能夠由如下宏定義解析:

  • WIFEXITED(status):若是子進程正常結束,它就返回真;不然返回假。
  • WEXITSTATUS(status):若是WIFEXITED(status)爲真,則能夠用該宏取得子進程exit()返回的退出碼。
  • WTERMSIG(status) 僅支持如下狀況:子進程觸發異常結束後經過WTERMSIG獲取的進程退出編號始終爲SIGUSR2。
  • 不支持的操做: WIFSTOPPED、WSTOPSIG、WCOREDUMP 、WIFCONTINUED。

waitpid

等待子進程結束並回收子進程資源。

options:不支持WUNTRACED,WCONTINUED;

status的值能夠由如下宏定義解析:

  • WIFEXITED(status):若是子進程正常結束,它就返回真;不然返回假。
  • WEXITSTATUS(status):若是WIFEXITED(status)爲真,則能夠用該宏取得子進程exit()返回的退出碼。
  • WTERMSIG(status)僅支持如下狀況:子進程觸發異常結束後經過WTERMSIG獲取的進程退出編號始終爲SIGUSR2。
  • 不支持:WIFSTOPPED 、WSTOPSIG、WCOREDUMP 、WIFCONTINUED。

調度

getpriority

獲取指定ID的靜態優先級。

  • 不支持:PRIO_PGRP、PRIO_USER。
  • 無動態優先級概念,用於設置靜態優先級。

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。

更多詳情請查看:點擊查看

相關文章
相關標籤/搜索