2017-09-29 77 views
1

我的主程序正在創建多個寫入stdout的子項。爲了避免它們寫在彼此,我使用的sprintf寫入組合,就像這樣:使用寫入系統調用進行Int陣列的不間斷打印

sprintf(buf, "Bubble Sort Process Started\n"); 
write(0, &buf, strlen(buf)); 

當我試圖打印出一個int數組我遇到一個問題。每次程序運行時,數組的大小都會發生變化,所以我不能讓一組sprintf一次打印所有內容。我可以想到的另一種打印方式是使用循環遍歷數組,但其他進程可能會使其輸出中途出現。我怎樣才能讓整個數組在沒有其他進程同時打印其輸出的情況下進行打印?

+0

順便說一句,我認爲你應該寫入fd 1而不是fd 0. – PSkocik

+1

'buf'是一個數組還是一個指針?無論如何,'write'的第二個參數應該是'buf',而不是'&buf'。但是如果'buf'是一個指針,那麼對'write'的調用將寫入指針值,而不是緩衝區內容。另外,文件描述符0通常是_standard input_,而不是_standard output_。 –

回答

0

假設您使用的是POSIX系統(您可能是這樣,根據您的假設判斷存在系統調用write),您應該能夠在開始寫入調用之前設置對filedescriptor 1的鎖定,並解鎖它在您完成write批次後。

下面是一個簡單的程序,演示了:

#include <unistd.h> 
#include <fcntl.h> 

void print(char C) 
{ 
    for(;;){ 
#if LOCK 
     fcntl(1, F_SETLKW, &(struct flock){ F_WRLCK, SEEK_SET, 0, 1 }); 
#endif 
     for(int i=0; i<100; i++) 
      write(1, &C, 1); 
     write(1, "\n", 1); 
#if LOCK 
     fcntl(1, F_SETLKW, &(struct flock){ F_UNLCK, SEEK_SET, 0, 1 }); 
#endif 
    } 
} 
int main() 
{ 
    for(int i=0; i<4; i++) /*4 children*/ 
     if(0==fork()) 
      print('a'+i); 
    pause(); /*terminate it with Ctrl+C*/ 

} 

此程序將創建4個孩子,每個試圖打印無窮級數線,其中的每一行由100個字符的C(「A」爲第一個孩子,第二個孩子的「b」等等)。由於一次寫入1個字節,所以這些行將交織在一起。用-DLOCK = 1進行編譯,並且每個輸出的行將不會中斷。