在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux和Windows系統中處理“事件”對象的函數

星星科技指導員 ? 來源:嵌入式計算設計 ? 作者:Eduard Trunov ? 2022-11-30 15:21 ? 次閱讀

在 Windows 代碼庫中,有一個常量INFINITE,它由第二個參數傳遞。此常量指示線程無限期地等待事件。常量在WinBase.h中聲明,定義為0xFFFFFFFF(或 -1)。

此外,Windows代碼還包括WAIT_TIMEOUT。此條件在 Linux 中沒有表示。實際上,借助以下功能可以繞過此限制:

int pthread_tryjoin_np(pthread_t thread, void **retval);

int pthread_timedjoin_np(

pthread_t thread,

void **retval,

const struct timespec *abstime

);

如果您參考pthread_tryjoin_np幫助頁面,您可以看到EBUSY可能是一個錯誤,并且 WaitForSingleObject無法通知我們。要了解線程的狀態并識別其退出代碼,必須調用該函數:

BOOL GetExitCodeThread(HANDLE hThread, PDWORD pdwExitCode);

退出代碼作為pdwExitCode指向的變量返回。如果在調用函數時線程尚未終止,則STILL_ACTIVE標識符將填充為變量。如果調用成功,則函數返回TRUE。

讓我們考慮一個 Linux 的pthread_tryjoin_np函數用法和Windows 的 GetExitCodeThreadWaitForSingleObject函數的情況。

#ifdef __PL_WINDOWS__

DWORD dwret;

BOOL bret;

DWORD h_process_command_thread_exit_code;

if (h_process_command_thread != NULL) {

bret = GetExitCodeThread(

h_process_command_thread,

&h_process_command_thread_exit_code

);

if (h_process_command_thread_exit_code == STILL_ACTIVE) {

dwret = WaitForSingleObject(

h_process_command_thread,

5000 // 5000ms

);

switch (dwret) {

case WAIT_OBJECT_0:

// everything from this point on is good break;

case WAIT_TIMEOUT:

case WAIT_FAILED:

default:

SetLastError(dwret);

break;

}

}

}

#endif //__PL_WINDOWS__

#ifdef __PL_LINUX__

int iret;

struct timespec wait_time = { 0 };

if (h_process_command_thread_initialized == 1) {

iret = pthread_tryjoin_np(

h_process_command_thread,

NULL

);

if ((iret != 0) && (iret != EBUSY)) {

//TODO: process the error

}

if (iret == EBUSY) {

clock_gettime(CLOCK_REALTIME, &wait_time);

ADD_MS_TO_TIMESPEC(wait_time, 5000);

iret = pthread_timedjoin_np(

h_process_command_thread,

NULL,

&wait_time

);

switch (iret) {

case 0:

// everything from this point on is good

break;

case ETIMEDOUT:

case EINVAL:

default:

break;

}

}

}

#endif //__PL_LINUX__

細心的讀者會注意到ADD_MS_TO_TIMESPEC是 Linux 操作系統中未表示的宏。 宏被添加到wait_time5000毫秒,但宏實現不在本文的討論范圍之內。還應該提到的是,在 Linux 中我們需要引入一個單獨的變量h_process_command_thread_initialized,因為pthread_t是無符號的 long(一般來說),我們無法驗證它。

讓我們總結一下結果。Linux 和 Windows 操作系統提供了在應用程序內部創建線程的機會。在Windows操作系統中,類型是HANDLE和Linux-pthread_t。如果在 Linux 操作系統中創建可連接線程,即使我們確定線程已終止,也有必要編寫pthread_join。這種做法將幫助我們避免系統資源泄漏。

討論的功能記錄在表 1 中。

Linux函數 窗口函數
pthread_create 開始線程
pthread_join WaitForSingleObject(.., INFINITE)
pthread_timedjoin_np GetExitCodeThreadWaitForSingleObject
pthread_tryjoin_np 獲取退出代碼線程

表 1.Windows 和 Linux 操作系統中的線程同步函數。

事件

事件是內核對象變體的實例。事件通知操作終止,通常在線程執行初始化,然后向另一個線程發出可以繼續工作的信號時使用。初始化線程將 ?event? 對象轉換為無信號狀態,然后繼續其操作。完成后,它將事件釋放到信號狀態。反過來,一直在等待事件將其狀態更改為信號的另一個線程恢復并再次成為計劃線程。

讓我們來看看在Windows和Linux操作系統中處理“事件”對象的函數。

在Windows操作系統中,使用CreateEvent函數創建一個“事件”對象:

HANDLE CreateEvent(

PSECURITY_ATTRIBUTES psa,

BOOL fManualReset,

BOOL fInitialState,

PCSTR pszName

);

讓我們更清楚地關注fManualReset和fInitialState參數。BOOL類型的FManualReset參數通知系統需要創建手動重置事件 (TRUE)或自動重置事件 (FALSE)。fInitialState參數確定事件的初始狀態:已發出信號 (TRUE)或未發出信號 (FALSE)。

創建事件后,可以管理狀態。要將事件轉換為信號狀態,您需要調用:

Bool SetEvent(HANDLE hEvent);

若要將事件狀態更改為無信號,需要調用:

Bool ResetEvent(HANDLE hEvent);

要等待事件信號,您需要使用我們已經熟悉的WaitForSingleObject函數。

在Linux操作系統中,“事件”對象表示整數描述符。一個整數 ?event? 對象是使用eventfd函數創建的:

int eventfd(unsigned int initval, int flags);

initval參數是一個內核服務計數器。flags參數是eventfd行為修改所必需的,可以是EFD_CLOEXEC、EFD_NONBLOCK或EFD_SEMAPHORE。如果成功終止,eventfd將返回一個新的文件描述符,該描述符可用于鏈接eventfd對象。

與SetEvent類似,我們可以使用eventfd_write調用:

ssize_t eventfd_write(int fd, const void *buf, size_t count);

從緩沖區調用寫入時,會將 8 字節整數值添加到計數器中。最大計數器值可以是 64 位無符號減 1。如果函數調用成功,則返回寫入的字節數。

在我們討論ResetEvent類似物之前,讓我們看一下輪詢函數。

#include

int poll(struct pollfd fdarray[], nfds_t nfds, int timeout);

輪詢功能允許應用程序同時阻止多個描述符,并在其中任何一個準備好讀取或寫入時立即接收通知。民意調查工作(一般)可以描述如下:

當任何描述符準備好進行輸入-輸出操作時發出通知。

如果沒有任何描述符準備就緒,請進入睡眠模式,直到一個或多個描述符準備就緒。

如果有可用的描述符準備用于輸入-輸出,請處理它們而不會阻塞。

返回到步驟 1。

Linux 操作系統為多路復用輸入輸出提供了三個實體:用于選擇(選擇)、輪詢(輪詢)、擴展輪詢(epoll)的接口

那些有使用select經驗的人可能會欣賞投票的優勢,它使用更有效的方法,基于位掩碼使用三組描述符。輪詢調用適用于文件描述符指向的單個nfdspollfd結構數組。

讓我們看一下pollfd結構定義:

struct pollfd {

int fd; /* file descriptor */

short events; /* requested events */

short revents; /* returned events */

};

每個pollfd結構中都指示了一個將被跟蹤的文件描述符。可以將多個文件描述符傳遞給輪詢函數(結構的 pollfd數組)。fdarray數組中的元素數由nfds參數確定。

為了將我們感興趣的事件傳達給內核,有必要在數組中每個元素的事件字段中寫入表 2 中的一個或多個值。從輪詢函數返回后,內核指定每個描述符發生的事件。

名字 事件 活動 描述
波林 + + 數據可供讀取(高優先級除外)
波爾德規范 + + 常規數據(優先級 0)可供讀取
波爾德班德 + + 具有非零優先級的數據可供讀取
波普里普里 + + 高優先級數據可供讀取
波羅特 + + 數據可供寫入
波爾沃諾姆 + + 類似于 波勞特
民意調查帶 + + 具有非零優先級的數據可用于寫入
波勒爾 + 發生錯誤
波爾赫普 + 連接丟失
波倫瓦爾 + 描述符和打開的文件不匹配

表 2.事件和輪詢函數的revents標志的可能值。

參數超時定義發生指定事件的等待時間。超時有三種可能的值。

timeout= -1:等待時間是無限的(在 WaitForSingleObject中為 INFINITE)。

timeout= 0:等待時間等于 0,表示需要檢查所有指定的描述符并將控制權交還給調用程序。

超時> 0:等待時間不超過超時毫秒。

在查看了輪詢函數之后,我們可以得出結論,在Windows操作系統中,“事件”對象與WaitForSingleObject類似。

讓我們轉到 Linux 的ResetEvent類似物。

#ifdef __PL_LINUX__

struct pollfd wait_object;

uint64_t event_value;

int ret;

if (eventfd_descriptor > 0) { // Descriptor created by eventfd(0,0)

wait_object.fd = eventfd_descriptor;

wait_object.events = POLLIN;

wait_object.revents = 0;

ret = poll(&wait_object, 1, 0); // Do not wait

if (ret < 0) { // Error

} else {

if ((wait_object.revents & POLLIN) != 0) {

iret = eventfd_read(eventfd_descriptor, &event_value);

if (iret != 0) { // Error }

}

}

}

#endif //__PL_LINUX__

最初我們檢查eventfd_descriptor是否大于零[2](實際上,這最初是由eventfd函數創建的,沒有錯誤)。之后,我們初始化pollfd函數并運行輪詢。需要執行輪詢以檢查是否有可用的數據可供讀取。如果有此類數據,我們將讀取它。

通過上述所有內容的鏡頭,讓我們反映表3中的結果:

窗口函數 Linux函數
創建事件 事件FD
設置事件 eventfd_write
重置事件 投票/eventfd_read
等待單個對象 民意調查

表 3.用于處理 Windows 中的事件及其在 Linux 中的類似事件的主要函數。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11420

    瀏覽量

    212319
  • WINDOWS
    +關注

    關注

    4

    文章

    3598

    瀏覽量

    90692
收藏 人收藏

    評論

    相關推薦

    飛凌嵌入式ElfBoard ELF 1板卡-Linux系統中斷之Linux中斷介紹

    一、Linux系統中使用中斷的一般步驟(一)中斷請求(IRQ Request):驅動程序使用request_irq()函數向內核請求分配中斷資源,并注冊中斷處理程序。該
    發表于 03-27 10:28

    詳解RTOS的Hook函數

    Hook函數是RTOS的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統行為。
    的頭像 發表于 03-24 16:14 ?210次閱讀

    鴻道Intewell操作系統為半導體行業打造高可靠實時控制系統

    。在半導體制造,Windows/Linux系統可用于運行人機界面(HMI)、數據處理和可視化等非實時任務,而鴻道Intewell實時
    的頭像 發表于 02-08 16:13 ?339次閱讀
    鴻道Intewell操作<b class='flag-5'>系統</b>為半導體行業打造高可靠實時控制<b class='flag-5'>系統</b>

    Hyper-V創建虛擬機配置IP等網絡配置原理(Linux、Windows為例)

    大家知道Windows系統里面內置了Hyper-V管理器,用來創建和管理本地虛擬機環境。今天我創建了兩臺虛擬機,一臺是CentOS7.9(Linux),另一臺是Windows 11,然
    的頭像 發表于 12-09 10:24 ?3784次閱讀
    Hyper-V創建虛擬機配置IP等網絡配置原理(<b class='flag-5'>Linux</b>、<b class='flag-5'>Windows</b>為例)

    Linux用戶管理終極指南:從基礎到進階

    登陸系統,只不過Linux支持多個用戶同時登陸。 F:難道Windows就不算多用戶操作系統嗎? Q:其實不是,在Windows
    的頭像 發表于 12-04 11:42 ?483次閱讀
    <b class='flag-5'>Linux</b>用戶管理終極指南:從基礎到進階

    盤點Linux系統的常見命令

    作為運維同學怎能不知道Linux系統的lsmod、lsof、lspci、lsscsi命令呢,今天就來盤一盤她及實例。
    的頭像 發表于 12-03 09:48 ?594次閱讀
    盤點<b class='flag-5'>Linux</b><b class='flag-5'>系統</b><b class='flag-5'>中</b>的常見命令

    如何判斷Linux系統的位數

    給你一個 Linux 系統,如何判斷它的位數? 我經常用的,有這么幾種方式。 第一個,使用命令: uname -m。 uname命令在 Linux 中用于顯示與操作系統內核相關的信息,
    的頭像 發表于 11-24 10:28 ?511次閱讀

    Mobaxterm 在 Windows 系統的應用

    MobaXterm 是一款功能強大的終端軟件,它集成了 SSH、Telnet、RDP、VNC、FTP、SFTP、X11 轉發等多種網絡協議,使得用戶可以在 Windows 系統上方便地進行遠程連接
    的頭像 發表于 11-10 15:34 ?1199次閱讀

    Linux用戶管理詳解

    用戶分為普通用戶和超級用戶,超級用戶在Windows系統為Administrator在Linux系統
    的頭像 發表于 11-01 09:48 ?413次閱讀

    RTOS鉤子函數的用途及用法

    在很多操作系統,都存在這樣一類API函數接口:HOOK函數(也叫鉤子函數)。
    的頭像 發表于 10-23 16:25 ?653次閱讀
    RTOS<b class='flag-5'>中</b>鉤子<b class='flag-5'>函數</b>的用途及用法

    Linux系統man命令的基本使用

    Linux系統提供了相對比較豐富的幫助手冊(man),man是manual的縮寫,在日常linux系統管理中經常用到,今天就簡單聊聊man。man 本身也提供自己的幫助手冊,通過man
    的頭像 發表于 09-29 15:59 ?763次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統</b><b class='flag-5'>中</b>man命令的基本使用

    Windows操作系統的常用命令

    這些命令不僅能提高工作效率,還能幫助用戶解決許多復雜的問題。本系列文章將詳細介紹Windows操作系統的常用命令,幫助你成為Windows極客!
    的頭像 發表于 08-07 15:40 ?949次閱讀
    <b class='flag-5'>Windows</b>操作<b class='flag-5'>系統</b><b class='flag-5'>中</b>的常用命令

    內網穿透——windows系統搭建私人影音平臺

    Windows系統搭建私人影音平臺并實現內網穿透,可以讓用戶隨時隨地遠程訪問自己的影音資源。以下是詳細的步驟和說明: 一、選擇影音服務器軟件 首先,需要選擇一款合適的影音服務器軟件。常見的影音
    的頭像 發表于 07-25 11:08 ?567次閱讀
    內網穿透——<b class='flag-5'>windows</b><b class='flag-5'>系統</b><b class='flag-5'>中</b>搭建私人影音平臺

    研華工控機用什么系統?WindowsLinux操作系統的較量

    工控機用什么系統WindowsLinux操作系統的較量。工控機(工業控制計算機)作為工業自動化和監控系統的核心組件,其穩定性、可靠性和性
    的頭像 發表于 06-14 14:38 ?922次閱讀
    研華工控機用什么<b class='flag-5'>系統</b>?<b class='flag-5'>Windows</b>與<b class='flag-5'>Linux</b>操作<b class='flag-5'>系統</b>的較量

    微軟將優化Windows Subsystem for Linux并加入圖形用戶界面設置

    微軟宣布提升Windows Subsystem for Linux(WSL)性能,推出全新設置應用提供圖形化配置環境。
    的頭像 發表于 05-31 11:26 ?730次閱讀
    主站蜘蛛池模板: 国模张文静啪啪私拍337p | 激情五月开心网 | 国产在线a不卡免费视频 | 天天在线天天综合网色 | 91黄视频在线观看 | 国模大尺度人体一区 | 欧美成人精品一级高清片 | 男人的天堂一区二区视频在线观看 | 久久综合精品视频 | 男女网站在线观看 | 色极影院| 亚洲天堂三级 | 九九精品在线观看 | 色多多视频在线观看播放 | 四虎国产精品永久在线看 | 在线国产你懂的 | 三级网站在线免费观看 | 在线高清视频大全 | 亚洲第一区视频在线观看 | 亚洲成人综合在线 | 成人午夜精品久久久久久久小说 | 国产精品午夜剧场 | 亚洲综合国产一区二区三区 | 日日射夜夜 | 啪啪小视频网站 | bt天堂中文在线 | 久色国产 | 免费看日本大片免费 | 欧美成人免费夜夜黄啪啪 | 亚洲婷婷国产精品电影人久久 | 磁力bt种子搜索在线 | 黄色在线观看视频网站 | 欧美亚洲专区 | 99 久久99久久精品免观看 | 亚洲精品久久久久午夜福 | 久久www免费人成_看 | 日本三浦理惠子中文字幕 | 亚洲免费在线看 | 色综合网天天综合色中文男男 | 看全黄大片狐狸视频在线观看 | 亚洲精品电影天堂网 |