2017-02-04 36 views
3

我已經開始關注C語言的命令處理,但是我遇到了這個C程序的問題。它在打算之前正在執行ls命令。C程序執行命令之前被告知

gcc的信息:

gcc version 6.2.1 20161124 (Debian 6.2.1-5) 

這是代碼:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int i; 

    printf("Is command processor available?\n"); 
    if (system(NULL)) 
    { 
     printf("Command processor available!\n"); 
    } 
    else 
    { 
     printf("Command processor not available!\n"); 
     exit(1); 
    } 

    printf("Executing command ls"); 
    i=system("ls"); 

    printf("Returned value is: %d.\n",i); 
    return 0; 
} 

的一段代碼,我講的就是這個具體線路:

printf("Executing command: ls"); 

如果程序用這段代碼運行輸出:

Is command processor available? 
Command processor is available 
systemProcessing systemProcessing.c 
Executing command: lsReturned value is: 0. 

其實之前被告知

它執行的命令但是,當我用一個新行完成代碼關「\ n」,其輸出爲預期:

Is command processor available? 
Command processor is available 
Executing command: ls 
systemProcessing systemProcessing.c 
Returned value is: 0. 

爲什麼在將新行添加到字符串中時,代碼將在執行之前打印出它將要執行的操作,但如果沒有它,它將執行並打印將要執行的內容?

回答

7

這是一個緩衝問題。你需要做的:

printf("Executing command ls"); 
fflush(stdout); //<< 
i=system("ls"); 

,或者,如果你的輸出是行緩衝終端,你就OK 與添加行,而不是一個明確的fflush(stdout)呼叫:

printf("Executing command ls\n"); 

stdio 101:

小的讀/寫操作系統效率低下,所以stdio IO(默認情況下)將每個文件句柄/描述符與輸入緩衝區和輸出緩衝區相關聯。 stdio輸出調用輸出到相應的FILE(在這種情況下,它是stdout)輸出緩衝區(通過memcpy字符串),並且只有當(大)緩衝區滿時,系統調用才能寫入整個緩衝區(解決問題)。

輸出緩衝區的顯式刷新可能與fflush()函數有關。此外,如果stdio檢測到輸出FILE是一個終端,它將使用行緩衝,這意味着只要遇到輸出中的換行符,它就會調用fflush()

stdio FILE的緩衝模式也可以使用setvbuf()函數明確處理。請參閱鏈接中的手冊頁以瞭解如何使用它。

+1

你給出的答案是信息豐富的,並將其實現爲代碼,就像一個魅力! 我希望能像你一樣有知識:) 謝謝! – Bl4ckH4z3

6

通過printf的標準輸出被緩衝,這意味着它在調用printf之後不會立即刷新到目的地。當您使用system在調用printf之後運行單獨的進程而沒有刷新新進程的輸出可能會在打印printf之前進行打印。

添加一條新行會產生差異,因爲新行會立即刷新緩衝區。您也可以使用fflush而不是換行符。