2013-06-21 74 views
0

我有以下代碼 它打印到屏幕上:哈哈 到文件:打開描述符並關閉,爲什麼這很重要?

haha 
hello 
Father finished 

如果我刪除線6和7,我得到不同的結果 爲什麼?

int main() 
{ 
// creates a new file having full read/write permissions 
int fd = open("myfile", O_RDWR|O_CREAT, 0666); 
write(fd, "haha\n", 5); 
close(fd);     // line 6 
fd = open("myfile", O_RDWR);  // line 7 
close(0); 
close(1); 
dup(fd); 
dup(fd); 
if (fork() == 0) 
{ 
    char s[100]; 
    dup(fd); 
    scanf("%s", s); 
    printf("hello\n"); 
    write(2, s, strlen(s));  
    return 0;     
} 
wait(NULL); 
printf("Father finished\n"); 
close(fd); 
return 0; 
} 
+0

當您刪除第6行和第7行時會得到什麼不同的結果? –

+0

沒什麼好看的 該文件包含:haha –

回答

0

文件描述符只有一個用於寫入和讀取的位置。當你在第4行寫入文件時,位置超過了剛剛寫入的位置,所以描述符的位置在文件的末尾。調用closeopen具有將位置重置爲文件開頭(等等)的效果。

您可以使用lseek(fd, 0, SEEK_SET)替換關閉和打開的呼叫,以獲得相同的效果,而無需關閉和重新打開該文件。

此外,您不應該混合stdio函數scanf,printf和低級函數,如write。由於stdio函數中的緩衝區,程序的結果將不可預知。

+0

好的,謝謝 現在明白了爲什麼屏幕上沒有輸出。 但是爲什麼文件只包含hahah而不是: haha​​ hello 父親完成 ? –

+0

在我的測試中它確實包含「哈哈你好父親完成」。你可能會得到不同的結果;像這樣將stdio與低級別的io混合會導致不可預知的結果。 – Joni

1

嘗試將scanf()註釋掉,重新編譯並重新運行。試圖超越EOF的scanf()可能會在stdio庫內部緩衝區中執行某些操作,導致printf()緩衝區中的此問題在進程_exit時未被刷新。只是猜測...