現來看二個程式。
#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類可以鎖定乙個物件,乙個執行緒只有得到這把鎖才可以對該物件...