我在寫日誌記錄時,項目當然是多線程、多進程的。有時候會出fwrite.c錯誤(windows 下面),項目中除了日誌會對檔案進行讀寫而外,沒有檔案讀內容,所以第一個想法就是:是不是日誌寫發生衝突了? 雖然這種錯誤的情況比較少,但還是引起了我的注意,於是我有一個問題:多進程、多線程對檔案進行寫操作會不會發生寫衝突?
為此我在 ubuntu上做了一下實驗,代碼如下:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(int argc,char *argv[]){ printf("hello\n"); int i=0 ; int file = open("myte",O_RDWR | O_CREAT); char buf[50] ="0123456789abcdefghijklmnopqrstuvwxyz\r\n" ; if(file<0){ perror("open file error"); exit(-1); } int fd = fork(); if(fd<0){ perror("fork error"); exit(-1); } if(fd>0){ int fd01 = fork(); for(i =1000;i>0;i--) if(fd01) { write(file,"pid01:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r\n",116); usleep(1);} else { write(file,"pid02:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r\n",116); usleep(1);} }else{ int fd02 = fork(); for(i =1000;i>0;i--) if(fd02) { write(file,"pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r\n",116); usleep(1);} else { write(file,"pid04:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r\n",116); usleep(1);} } printf("after fork\n"); sleep(1); close(file); return 0;}
代碼的功能:四個進程同時對一個開啟的檔案進行寫操作為了讓他們並行的程度高一點每寫段資料,睡10 毫秒
運行結果:
15 pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz
16 pid01:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz
17 pid02:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz
18 pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz
19 pid04:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz
...........................................
上面只是複製了從 15 ~19行結果的一小段
結果:從上面的結果來看:1. 四個進程是穿插運行 2. 每個寫操作都獨立進行了,不存在寫了一半後,被其它的進程打斷的現象
該實驗的結果並沒有產生寫衝突,也沒有寫中斷 ,但是這隻是其中一個執行個體而已,還需要進一步的理論推證.......