<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                在從Logger日志驅動程序讀取或者寫入日志記錄之前,首先要調用函數open來打開對應的日志設備文件。在Logger日志驅動程序中,日志設備文件的打開函數定義為logger_open,它的實現如下所示。 **kernel/goldfish/drivers/staging/android/logger.c** ~~~ /* * logger_open - the log's open() file operation * * Note how near a no-op this is in the write-only case. Keep it that way! */ static int logger_open(struct inode *inode, struct file *file) { struct logger_log *log; int ret; ret = nonseekable_open(inode, file); if (ret) return ret; log = get_log_from_minor(MINOR(inode->i_rdev)); if (!log) return -ENODEV; if (file->f_mode & FMODE_READ) { struct logger_reader *reader; reader = kmalloc(sizeof(struct logger_reader), GFP_KERNEL); if (!reader) return -ENOMEM; reader->log = log; INIT_LIST_HEAD(&reader->list); mutex_lock(&log->mutex); reader->r_off = log->head; list_add_tail(&reader->list, &log->readers); mutex_unlock(&log->mutex); file->private_data = reader; } else file->private_data = log; return 0; } ~~~ 函數第11行調用函數nonseekable_open將相應的設備文件設置為不可隨機訪問,即不可以調用函數lseek來設置設備文件的當前讀寫位置,因為日志記錄的讀取或者寫入都必須按順序來進行。 函數第15行調用函數get_log_from_minor根據從設備號獲得要操作的日志緩沖區結構體。 **kernel/goldfish/drivers/staging/android/logger.c** ~~~ static struct logger_log * get_log_from_minor(int minor) { if (log_main.misc.minor == minor) return &log_main; if (log_events.misc.minor == minor) return &log_events; if (log_radio.misc.minor == minor) return &log_radio; return NULL; } ~~~ 回到函數logger_open中,對于以寫模式打開日志設備的情況,函數logger_open只是把前面獲得的日志緩沖區結構體log保存在參數file的成員變量private_data中就結束了;而對于以讀模式打開日志設備的情況,函數logger_open的處理就相對復雜一些。函數logger_open首先會為當前進程創建一個logger_reader結構體reader,并且對它進行初始化,其中,最重要的是第30行告訴該進程從log->head位置開始讀取日志記錄,然后把前面獲得的日志緩沖區結構體log保存在結構體reader的成員變量log中,并且把結構體reader保存在參數file的成員變量private_data中。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看