關於Linux log機制的一些整理

來源:互聯網
上載者:User

很久以前整理的,今天偶然看到了,放到網上方便查詢。

一、     
syslogd和klogd

syslogd與syslog配套使用,主要用於daemon輸出log。

Klogd讀/proc/kmsg,儲存的是kernel log。Klogd啟動時有一個-f選項,用於指定儲存kernel
log的檔案。如果沒有指定,會發送到syslog,由syslog統一儲存。

二、     
daemon函數

調用daemon函數可用於將程式轉入後台,並斷開與終端的標準輸入輸出串連。

daemon(0, 0);  // 參數定義看查看man文檔

假設有一個包含printf的可執行檔test。

./test          // 能看到printf

./test &       // 能看到printf

Test中如果調用了daemon(0, 0), 那麼與標準輸入輸出的串連就斷了,看不到printf。

三、/dev/ptmx

Ptmx是虛擬串口終端,用於進程間通訊。主端開啟/dev/ptmx,得到fd執行個體後,系統會在/dev/pts目錄下產生這個執行個體的對端裝置。對端裝置的名稱可由ptsname得到。

char *ptsname(int fd);

得到對端裝置名稱後,主端需要調用grantpt和unlockpt。這兩個函數一個與設定對端檔案許可權有關,一個用於unlock對端裝置。之後,對端進程開啟該執行個體,就能與主端通訊了。

四、Android中的logwrapper

logwrapper是android中的工具,與logcat配套使用,可用於native進程的log輸出。Logwrapper執行fork產生子進程,父子進程通過/dev/ptmx通訊。子進程開啟ptmx虛擬串口終端後,會將其設定成標準輸出和錯誤輸出,然後調用execvp執行想要執行的進程。由於使用的是execvp,所以子進程能繼承logwrapper中設定的標準輸出和錯誤輸出。父進程等在/dev/pts的另一端,得到子進程發送的資料後調用log函數轉寄到logcat。

注一:設定標準輸入輸出的方法:

        dup2(fd, 1);

        dup2(fd, 2);

五、Android中syslog的實現

Android中沒有syslogd和klogd,但為了相容使用syslog的程式,在bionic目錄下有syslog函數的實現。這裡的syslog函數會將列印內容輸出到/dev/log,即logcat中;也有版本是輸出到/dev/kmsg,也就是最終調用prink作為核心log輸出。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.