<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                Logger日志驅動程序主要使用到了logger_entry、logger_log和logger_reader三個結構體。下面我們就詳細描述它們的定義。 **struct logger_entry** **kernel/goldfish/drivers/staging/android/logger.h** ~~~ struct logger_entry { __u16 len; /* length of the payload */ __u16 __pad; /* no matter what, we get 2 bytes of padding */ __s32 pid; /* generating process's pid */ __s32 tid; /* generating process's tid */ __s32 sec; /* seconds since Epoch */ __s32 nsec; /* nanoseconds */ char msg[0]; /* the entry's payload */ }; #define LOGGER_ENTRY_MAX_LEN (4*1024) #define LOGGER_ENTRY_MAX_PAYLOAD \ (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry)) ~~~ 結構體logger_entry用來描述一個日志記錄。每一個日志記錄的最大長度為4K,其中,日志記錄的有效負載長度最大等于4K減去結構體logger_entry的大小。成員變量len表示實際的日志記錄的有效負載長度;成員變量__pad沒有實際意義,是用來將成員變量pid的地址值對齊到4字節邊界的;成員變量pid和tid記錄寫入該日志記錄的進程的TGID和PID,即線程組ID和進程ID;成員變量sec和nsec記錄寫入該日志記錄的時間,它們是用標準基準時間(Epoch) 1 來描述的;成員變量msg記錄的是實際寫入的日志記錄內容,它的長度是可變的,由成員變量len決定。 **struct logger_log** **kernel/goldfish/drivers/staging/android/logger.c** ~~~ /* * struct logger_log - represents a specific log, such as 'main' or 'radio' * * This structure lives from module insertion until module removal, so it does * not need additional reference counting. The structure is protected by the * mutex 'mutex'. */ struct logger_log { unsigned char * buffer; /* the ring buffer itself */ struct miscdevice misc; /* misc device representing the log */ wait_queue_head_t wq; /* wait queue for readers */ struct list_head readers; /* this log's readers */ struct mutex mutex; /* mutex protecting buffer */ size_t w_off; /* current write head offset */ size_t head; /* new readers start here */ size_t size; /* size of the log */ }; ~~~ 結構體logger_log用來描述一個日志緩沖區。在Logger日志驅動程序中,每一種類型的日志都對應有一個單獨的日志緩沖區。成員變量buffer指向一個內核緩沖區,用來保存日志記錄,它是循環使用的,大小由成員變量size決定;成員變量misc的類型為miscdevice,用來描述一個日志設備2;成員變量wq是一個等待隊列,用來記錄那些正在等待讀取新的日志記錄的進程;成員變量readers是一個列表,用來記錄那些正在讀取日志記錄的進程,每一個進程都使用一個結構體logger_reader來描述;成員變量mutex是一個互斥量,用來保護日志緩沖區的并發訪問3;成員變量w_off表示下一條要寫入的日志記錄在日志緩沖區中的位置;成員變量head表示當一個新的進程讀取日志時,它應該從日志緩沖區中的什么位置開始讀取。 **struct logger_reader** **kernel/goldfish/drivers/staging/android/logger.c** ~~~ /* * struct logger_reader - a logging device open for reading * * This object lives from open to release, so we don't need additional * reference counting. The structure is protected by log->mutex. */ struct logger_reader { struct logger_log * log; /* associated log */ struct list_head list; /* entry in logger_log's list */ size_t r_off; /* current read head offset */ }; ~~~ 結構體logger_reader用來描述一個正在讀取某一個日志緩沖區的日志記錄的進程。成員變量log指向要讀取的日志緩沖區結構體;成員變量list是一個列表項,用來連接所有讀取同一種類型日志記錄的進程;成員變量r_off表示當前進程要讀取的下一條日志記錄在日志緩沖區中的位置。 > 注: > 1. 也稱為格林威治時間或者新紀元時間,即1970.1.1 00:00:00 GMT。 > 2. Linux將硬件設備劃分為字符(char)設備、塊(block)設備和misc設備三種類型。每一個設備都有自己的主設備號和從設備號,其中,相同類型的設備具有相同的主設備號,但是具有不同的從設備號。有關Linux設備的知識,可以參考《Linux Device Drivers》一書。 > 3. 同一種類型的日志可能會被多個進程同時讀寫,因此,需要對它的日志緩沖區進行并發訪問保護。
                  <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>

                              哎呀哎呀视频在线观看