關閉Linux中的串列埠列印
阿新 • • 發佈:2019-02-12
轉載地址:http://blog.csdn.net/zmc1216/article/details/34473197
專案中用到串列埠通訊,但是這個串列埠也用於控制檯。為了保證串列埠通訊時不能有控制檯發出的訊息,需要關閉列印。
在測試過程中發現,有三種類型的列印,一是uboot的列印,在Starting kernel ...之前的列印都是;二是prink的列印,linux kernel不能用printf,對應的輸出函式是printk,它的實現在kernel/printk.c中;三是應用層的printf。
1、去掉printk列印
在linux核心中的/kernel目錄下printk.c檔案中有一個函式:
static void __call_console_drivers(unsigned long start, unsigned long end)
{
struct console *con;
for (con = console_drivers; con; con = con->next) {
if ((con->flags & CON_ENABLED) && con->write)
con->write(con, &LOG_BUF(start), end - start);
}
}
去掉如下兩行重新編譯核心即可:
if ((con->flags & CON_ENABLED) && con->write)
con->write(con, &LOG_BUF(start), end - start);
2、標準輸出、標準錯誤輸出重定向
int main() { int pid = 0; // fork a worker process if (pid = fork()) { // wait for completion of the child process int status; waitpid(pid, &status, 0); } else { // open /dev/null int fd_null = open("/dev/null",
O_RDWR
); if(dup2(fd_null, 1) == -1) return 1; if(dup2(fd_null, 2) == -1) return 1; XX_run(); } return 0; }
我將標準輸出和錯誤輸出重定向到/dev/null中如果我沒有將輸出重定向,只是關閉輸出,close(1) close(2),程式經常出現錯誤,這個還需要繼續研究。