Linux核心開發之非同步通知與非同步I/O(四)

來源:互聯網
上載者:User

“小王,接著昨天的來,你知道嗎?在非同步IO中,什麼可以用來做為AIO的通知呢?”我用渴求的眼神望著她.

"啊?那我咋知道,你說的我能記住就不錯了,讓我發明創造,我可是不會."小王委屈道。

“笨死了,我前邊花了那麼多的時間來講訊號之類的東西,聯想一下訊號作為非同步通知的訊號,也想的出來啊,告訴你,我當年用腳肢頭都能想到,可你..真讓我失望”我歎氣到,“算了,也不怪你了,咱們開始繼續學習吧“。

  先上代碼:使用訊號作為AIO非同步IO通知機制

void setup_io(..){    int fd;    struct sigaction sig_act;    struct aiocb my_aiocb;    ...    //設定訊號處理函數     sigemptyset(&sig_act.sa_mask);    sig_act.sa_flags = SA_SIGINFO;    sig_act.sa_sigaction = aio_completion_handler;    //設定AIO請求     bzero((char *)&my_aiocb, sizeof(struct aiocb));    my_aiocb.aio_flags = fd;    my_aiocb.aio_buf = malloc(BUF_SIZE + 1);    my_aiocb.aio_nbytes = BUF_SIZE;    my_aiocb.offset = next_offset;    //串連AIO請求和訊號處理函數     my_aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNVAL;    my_aiocb.aio_sigevent.sigev_signo = SIGIO;    my_aiocb.aic_sigevent.sigev_value.sival_ptr = &my_aiocb;    //將訊號和處理函數綁定    ret = sigaction(SIGION, &sig_act, NULL);   ...    ret = aio_read(&my_aiocb);} //訊號處理函數void aio_completion_handler(int signo, siginfo_t *info, void *context){    struct aiocb *req;    //確定是我們需要的訊號    if(info->si_signo == SIGIO)    {     req = (struct aiocb *)info->si_value.sival_ptr; //獲得aiocb;     //請求的操作是否完成     if(aio_error(req) ==0 )     {         ret = aio_return(req);     }    }    return ;}

從上邊可以看到,使用AIO的應用程式同樣需要定義訊號處理函數,在指定的訊號被產生時會觸發調用這個處理常式。

“那麼是不是就只能使用訊號這種方式呢,我記得以前沒一個知識點你都給我講了好多方法,這個歌也不例外吧”小王說。

“嗯,真聰明,就喜歡聰明的女生”聽到小王也懂得開動腦子了,我也要表示表示不是。

再上代碼:使用回呼函數最為AIO的通知

void setup_io(..){    ...//同上    //串連AIO請求和線程回呼函數    my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD;    my_aiocb.aio_sigevent.notify_function = aio_completion_handler;    //設定回呼函數     my_aiocb.aio_sigevent.notify_attributes = NULL;        my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;    ...    ret = aio_read(&my_aiocb);} //訊號處理函數void aio_completion_handler(int signo, siginfo_t *info, void *context){    struct aiocb *req;    req = (struct aiocb *)sigval.sival_ptr; //獲得aiocb;     //請求的操作是否完成    if(aio_error(req) ==0 )    {         ret = aio_return(req);    }    return ;}

上述程式在建立aiocb請求之後,使用SIGEV_THREAD請求了一個線程回呼函數作為通知方法。在回呼函數中。通過(struct aiocb *)info->si_value.sival_ptr可以獲得對應的aiocb指標,使用AIO函數可驗證請求是否已經完成。

“不過,小王,對不起哈,沒想到一說就收不住了,這節也只是講了有關的應用,下節咱們開始講講AIO與驅動裝置,迴歸驅動主題”。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.