2012-11-25 79 views
1

這是我的程序:爲什麼下列語句打印三次?

int main(int argc, char * argv[]) 
{ 
    pid_t child; 
    int i=0; 

    if(argc < 4){ 
     printf("Usage: %s <num_threads> <test_interval> <no_of_prints>\n", argv[0]); 
     exit(1); 
    } 

    // Some program logic goes here 

    printf("context - switch \n\nPid\ttid\tNPid\tNtid\tJiffies\n\n"); 

    syscall(320);  

    child = fork(); 

    if(child == 0) { //in child 
     fork(); 
     fork(); 
     process(); 
    } 
    else { 
      wait(child); 
      //Do some printing here 
    } 

我的輸出具有圖3(有時2)打印 「上下文 - 開關」 printf線。

回答

2

這可能是因爲stdio緩衝。簡而言之,多個進程(父進程,子進程,孫子進程等)最終擁有相同的緩衝區,並在死亡時將它們寫入屏幕。嘗試:

printf("context - switch \n\nPid\ttid\tNPid\tNtid\tJiffies\n\n"); 
fflush(stdout); 

或者,也許只是使用write(2),而不是printf

+1

但打印的字符串以換行符(兩個偶數)結束,並且使用普通的行緩衝標準輸出,應該刷新緩衝區,不是嗎? –

+0

@DanielFischer不一定,特別是如果輸出重定向到非tty。無論如何,該標準在達到\ n時不會對緩衝區進行刷新。 – cnicutar

+0

是的,這是真的,沒有保證。但是如果打印到tty,這將是相當不尋常的。不過,我沒有想到重定向。 –