溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Sinlinx A64開(kāi)發(fā)板Linux內(nèi)核等待隊(duì)列poll中什么是阻塞與非阻塞

發(fā)布時(shí)間:2021-10-22 10:05:32 來(lái)源:億速云 閱讀:146 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家介紹Sinlinx A64開(kāi)發(fā)板Linux內(nèi)核等待隊(duì)列poll中什么是阻塞與非阻塞,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

 開(kāi)發(fā)平臺(tái) 芯靈思Sinlinx A64
內(nèi)存: 1GB   存儲(chǔ): 4GB
開(kāi)發(fā)板詳細(xì)參數(shù) https://m.tb.cn/h.3wMaSKm**

阻塞:阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前進(jìn)程程會(huì)被掛起(休眠)。函數(shù)只有在得到結(jié)果之后才會(huì)返回。默認(rèn)情況下,文件都是以這種方式打開(kāi)。 非阻塞:指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前進(jìn)程程,而會(huì)立刻返回。應(yīng)用程序可選擇以阻塞或非阻塞方式打開(kāi)設(shè)備文件,然后設(shè)備進(jìn)行讀寫(xiě)操作,如果驅(qū)動(dòng)的讀寫(xiě)函數(shù)支持阻塞和非阻塞功能,這兩種打開(kāi)方式才會(huì)有區(qū)別。

阻塞示例 :fd = open("/xxx/word", O_RDONLY ); // 默認(rèn)阻塞方式打開(kāi) 如果此時(shí)沒(méi)有數(shù)據(jù)可以讀取,則執(zhí)行休眠 如果有數(shù)據(jù)可以讀取,則馬上讀取數(shù)據(jù),不休眠,讀取數(shù)據(jù)后馬上返回。 非阻塞示例 :fd = open("/xxx/word", O_RDONLY | O_NONBLOCK ); //非阻塞方式打開(kāi) 如果此時(shí)已經(jīng)有數(shù)據(jù)可以讀取,則讀取數(shù)據(jù)再返回。 如果沒(méi)有數(shù)據(jù)可以讀,也馬上返回,但是返回一個(gè)錯(cuò)誤碼。

1)驅(qū)動(dòng)中如何得到用戶(hù)空間應(yīng)用程序打開(kāi)的方式?
open一個(gè)設(shè)備,內(nèi)核會(huì)創(chuàng)建一個(gè)file結(jié)構(gòu),并且把打開(kāi)方式的數(shù)值存放到file結(jié)構(gòu)成員f_flags成員中,驅(qū)動(dòng)程序的read,write 接口可以使用參數(shù)file指針取得文件打開(kāi)方式。file結(jié)構(gòu)中有一個(gè)成員是f_flags ,創(chuàng)建時(shí)候,內(nèi)核會(huì)把open 函數(shù)的最后一個(gè)參數(shù) flag 數(shù)值保存在 f_flags 變量中。

static ssize_t xxx_read(struct file *pfile, char user *buf, size_t count, loff_t *poff)
{
    ……
    //判斷當(dāng)前是否有按鍵動(dòng)作
    if(沒(méi)有按鍵動(dòng)作)
    {
        //判斷 pfile->f_flags 成員是否設(shè)置 O_NONBLOCK  
        if(pfile->f_flags & O_NONBLOCK) //表示用戶(hù)空間使用非阻塞打開(kāi)
        {
                return - EAGAIN; //返回一個(gè)錯(cuò)誤碼,告訴用戶(hù)空間你可以再?lài)L試讀取
        }
        //阻塞方式打開(kāi),沒(méi)有數(shù)據(jù)就休眠,不馬上返回else
        {
                //休眠,等待有按鍵動(dòng)作喚醒進(jìn)程。
        }
    }
}

2)如何知道是否有按鍵動(dòng)作? 如果按鍵按鍵或松開(kāi)時(shí)刻,會(huì)產(chǎn)生一個(gè)中斷,所以,在中斷程序設(shè)置一個(gè)標(biāo)志即可。 定義一個(gè)全局變量,初始值為 0,表示沒(méi)有按鍵動(dòng)作發(fā)生,在中斷程序中設(shè)置這個(gè)變量值為 1,表示發(fā)生按鍵動(dòng)作。

3)如何讓進(jìn)程進(jìn)入休眠狀態(tài)? 最簡(jiǎn)單,最直接的休眠方式: msleep 函數(shù) 這個(gè)函數(shù):一旦調(diào)用,則調(diào)用進(jìn)程會(huì)休眠指定長(zhǎng)的時(shí)間,時(shí)間一到內(nèi)核會(huì)喚醒這個(gè)進(jìn)程. //休眠,等待有按鍵動(dòng)作喚醒進(jìn)程。

    while(press == 0)
                 msleep(5); // 休眠5ms

關(guān)于Sinlinx A64開(kāi)發(fā)板Linux內(nèi)核等待隊(duì)列poll中什么是阻塞與非阻塞就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI