1. 程式人生 > >關閉Linux中的串列埠列印

關閉Linux中的串列埠列印

轉載地址: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),程式經常出現錯誤,這個還需要繼續研究。