同乙個檔案共同讀寫 open中O SYNC用法

2021-05-23 05:55:56 字數 1852 閱讀 3235

現來看二個程式。

#include

#include

#include

#include

#include

#include

int main()

lseek(fd,-3,seek_end);

char buffer[32]="hello";

sleep(10);

write(fd,buffer,strlen(buffer));

close(fd);

return 0;

}另乙個程式

#include

#include

#include

#include

#include

#include

int main()

lseek(fd,-3,seek_end);

char buffer[32]="33333333333";//修改的地方

sleep(5);//修改的地方

write(fd,buffer,strlen(buffer));

close(fd);

return 0;

}test檔案的內容是

1111111111111

2222222222222

這個時候2個程式同時執行,將會怎樣呢 ,執行結果如下

pipi@ubuntu:~/c$ cat test

1111111111111

222222222223333333333333333pipi@ubuntu:~/c$ cat test

1111111111111

222222222223333333333333333pipi@ubuntu:~/c$ cat test

1111111111111

222222222223333333333333333pipi@ubuntu:~/c$ cat test

1111111111111

222222222223333333333333333pipi@ubuntu:~/c$ cat test

1111111111111

22222222222hello33333333333pipi@ubuntu:~/c$

也就是說開啟檔案後,系統不會自動更新檔案寫的位置,對於每個「檔案狀態標誌」和「當前檔案偏移量」 不會更新。

對於多程序的時候:

#include

#include

#include

#include

#include

#include

int main()

pid_t pid;

if((pid=fork())<0)

if(pid==0)

else

return 0;

}結果是:

pipi@ubuntu:~/c$ cat test

1111111111111

2222222222222

pipi@ubuntu:~/c$ cat test

1111111111111

22222222222333333333333pipi@ubuntu:~/c$ cat test

1111111111111

22222222222333333333333hellopipi@ubuntu:~/c$

系統會自動更新檔案指標,這個時候是由於程序共享同乙個檔案描述符,同時共享檔案表和當前檔案偏移量。

對於open()中引數o_sync的應用,在寫檔案的時候,未寫完的時候,中斷或者系統排程或者smp環境的時候,write一直阻塞,直到寫完。

對於 dup 會共享同乙個檔案表,對於open()同乙個檔案,此時會有乙個新的檔案 表狀態。

讀寫同乙個檔案出問題

在c primer plus 第六版中的第十三章程式設計練習第3題出現了問題。題目 編寫乙個檔案拷貝程式,提示使用者輸入文字檔案名,並以該檔名作為源檔名和輸出檔名。該程式要使用ctype.h中的toupper 函式,在寫入到輸出檔案時把所有文字轉換成大寫。使用標準的i o和文字模式。我一開始就只建立...

C C 業務 多程序同時讀寫同乙個檔案

include intflock int fd,int operation 引數說明 返回值說明 返回0表示成功,若有錯誤則返回 1,錯誤 存於errno。lock 會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔案的某一區域。...

解決多執行緒讀寫同乙個檔案的異常

多執行緒公用乙個物件時,也會出現和公用 類似的問題,這種問題就不應該使用lock關鍵字了,這裡需要用到system.threading中 的乙個類monitor,我們可以稱之為監視器,monitor提供了使執行緒共享資源的方案。monitor類可以鎖定乙個物件,乙個執行緒只有得到這把鎖才可以對該物件...