很久以前整理的,今天偶然看到了,放到網上方便查詢。
一、
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輸出。