日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

多进程/多线程同时向一个文件中写入日志如何避免冲突?

發(fā)布時(shí)間:2024/10/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多进程/多线程同时向一个文件中写入日志如何避免冲突? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫入文件時(shí)都會(huì)調(diào)用函數(shù) write,由于所有的系統(tǒng)調(diào)用都是原子的,所以該函數(shù)可以保證進(jìn)程或者線程寫入數(shù)據(jù)的過(guò)程中不會(huì)被其他進(jìn)程或者線程打擾,即:數(shù)據(jù)中間插入別的進(jìn)程的數(shù)據(jù)。

另外一個(gè)問題,由于 write 之前需要指定寫入位置,即:lseek 函數(shù),同樣,該函數(shù)也是原子的。

整體來(lái)說(shuō),在一個(gè)寫入數(shù)據(jù)的操作如下:

lseek(fd, 0, SEEK_END); // seek to the end of the filewrite(fd, "log message", len); // perform the write

but,這兩個(gè)函數(shù)需要依次完成,中間不能被別的進(jìn)程或者線程插入寫入它們的數(shù)據(jù),也就是說(shuō)為了保證多進(jìn)程或者多線程同時(shí)向一個(gè)文件中寫入數(shù)據(jù)時(shí)能夠避免沖突,需要上述兩個(gè)函數(shù)的執(zhí)行是事務(wù)性的。

為了解決這個(gè)問題,可以用標(biāo)志位 O_APPEND,其含義是在每次打開文件時(shí),都將標(biāo)志位移動(dòng)到文件的末端,這個(gè)過(guò)程時(shí)原子的。

#include <stdio.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/wait.h>int main() {char *filename = "my_data.txt";int fd = open(filename, O_WRONLY | O_CREAT);pid_t pid = fork();if (0 == pid){printf("this is child: %ld\n", (long)getpid());char buf[20];memset(buf, 'D', sizeof(buf));int fd = open(filename, O_WRONLY | O_CREAT | O_APPEND);write(fd, buf, sizeof(buf));close(fd);}else{printf("this is father: %ld\n", (long)getpid());char buf[30] = {2};memset(buf, 'A', sizeof(buf));buf[29] = '_';int fd = open(filename, O_WRONLY | O_CREAT | O_APPEND);write(fd, buf, sizeof(buf));close(fd);int status;wait(&status);}return 0; }

結(jié)果:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA_DDDDDDDDDDDDDDDDDDDD

?

(SAW:Game Over!)

?

總結(jié)

以上是生活随笔為你收集整理的多进程/多线程同时向一个文件中写入日志如何避免冲突?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。