多個程序對同乙個檔案進行訪問會使得寫入的資料出現錯亂嗎,write與fwrite之間到底有什麼區別呢,哪種情況會丟掉資料呢.
多個程序寫同乙個檔案不會出現資料交叉的情況
在多程序使用write時不會丟掉資料,fwrite會丟掉資料
fwrite速度優於writewrite版本
#include
#include
#include
#include
#include
#include
intmain()
close
(fd)
;break;}
case-1
:perror
("error message\n");
break
;default
:close
(fd)
;break;}
}return0;
}
非常簡單的乙個測試** 父子程序同時向test.txt檔案寫內容 我們可以看到結果是這樣的,
我們可以看到父子程序交替列印 且200000行沒有丟失資料
如果改為fwrite呢 我們來看看下面的測試**
#include
#include
#include
#include
#include
intmain()
fclose
(fl)
;break;}
case-1
:perror
("error message\n");
break
;default
:fclose
(fl)
;break;}
}return0;
}
我們來看看列印結果
我們可以發現 出現了資料交叉 且不止一處出現了資料交叉 而且資料只有一半,有十萬行資料丟失了,
對比一下時間 也非常的令人震驚
write:
接下來的問題是為什麼多程序write寫入不會出現資料交叉,而fwite會出現
ssize_t generic_file_aio_write
(struct kiocb *iocb,
const
char __user *buf,
size_t count, loff_t pos)
;bug_on
(iocb->ki_pos != pos)
;down
(&inode->i_sem)
; ret =
__generic_file_aio_write_nolock
(iocb,
&local_iov,1,
&iocb->ki_pos);up
(&inode->i_sem);if
(ret >0&&
((file->f_flags & o_sync)
||is_sync
(inode)))
return ret;
}
inline
intgeneric_write_checks
(struct file *file, loff_t *pos, size_t *count,
int isblk)if(
!isblk)if(
*count > limit -
(typeof
(limit)
)*pos)}.
....
....
....
....
......}
generic_write_checks由__generic_file_aio_write_nolock呼叫
200000
200000
1800000 test.txt
send與recv也是原子操作 意味著我們對套接字的操作也是多程序或多執行緒操作的
本人水平有限,錯誤之處請指正
參考多執行緒追加檔案,不加鎖,會出現什麼情況 ?
write 操作在超過 pipe_buf 時不保證原子性
PHP解決多程序同時讀寫乙個
php解決多程序同時讀寫乙個檔案的問題 陌上花開 首先php是支援程序的而不支援多執行緒 這個先搞清楚了 如果是對於檔案操作,其實你只需要給檔案加鎖就能解決,不需要其它操作,php的flock已經幫你搞定了。用flock在寫檔案前先鎖上,等寫完後解鎖,這樣就實現了多執行緒同時讀寫乙個檔案避免衝突。大...
PHP解決多程序同時讀寫乙個
php解決多程序同時讀寫乙個檔案的問題 陌上花開 首先php是支援程序的而不支援多執行緒 這個先搞清楚了 如果是對於檔案操作,其實你只需要給檔案加鎖就能解決,不需要其它操作,php的flock已經幫你搞定了。用flock在寫檔案前先鎖上,等寫完後解鎖,這樣就實現了多執行緒同時讀寫乙個檔案避免衝突。大...
PHP解決多程序同時讀寫乙個檔案的問題
這個問題怎麼說呢,首先php是不支援多執行緒的,所以我想你應該說的是多程序吧,如果是對於檔案操作,其實你只需要給檔案加鎖就能解決,不需要其它操作,php的flock已經幫你搞定了。flock file,lock,block file 必需,規定要鎖定或釋放的已開啟的檔案 lock 必需。規定要使用哪...