• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 牛人業話 > Linux內核開發之異步通知與異步I/O(四)

    Linux內核開發之異步通知與異步I/O(四)

    作者: 時間:2016-12-22 來源:網絡 收藏

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

    本文引用地址:http://www.czjhyjcfj.com/article/201612/341941.htm

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

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

      先上代碼:使用信號作為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與驅動設備,回歸驅動主題”。



    關鍵詞: Linux 異步通知

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 兴安盟| 车致| 连云港市| 商都县| 衡水市| 竹溪县| 静宁县| 墨竹工卡县| 德江县| 烟台市| 岢岚县| 舒兰市| 永胜县| 天水市| 皮山县| 大关县| 英山县| 手游| 无棣县| 博罗县| 时尚| 平度市| 伊金霍洛旗| 楚雄市| 柘城县| 东乡县| 富川| 错那县| 达孜县| 永新县| 金溪县| 亳州市| 鹿泉市| 图片| 柘城县| 自治县| 正镶白旗| 罗定市| 蒙山县| 平武县| 沧州市|