多程序讀能否同時寫乙個檔案

2021-10-01 19:00:38 字數 2380 閱讀 2098

多個程序對同乙個檔案進行訪問會使得寫入的資料出現錯亂嗎,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 必需。規定要使用哪...