免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: unistd
打印 上一主题 下一主题

多进程/线程忘同一个文件里写日志的时候,如何保证不混淆? [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
21 [报告]
发表于 2014-08-18 10:21 |只看该作者
本帖最后由 yulihua49 于 2014-08-18 10:25 编辑
unistd 发表于 2010-04-13 10:34
突然想起一个问题来,就是好多个进程或者线程同时往一个日志文件里写东西,会不会发生第一个进程写了一条日 ...

多进程用文件锁或同步写。多线程用互斥锁。
  1.         va_start(vlist,fmt);
  2.         pthread_mutex_lock(&log_mutex);
  3.         vfprintf(stderr,ufmt,vlist);
  4.         fflush(stderr);
  5.         pthread_mutex_unlock(&log_mutex);
  6.         va_end(vlist);
复制代码
多进程打开文件时:
  1.         pthread_mutex_lock(&log_mutex);
  2.         if(!*LOGFILE || strcmp(LOGFILE,fn)) {
  3.                 strcpy(LOGFILE,fn);
  4.                 ret=stat(LOGFILE,&sbuf);
  5.                 if(ret<0 || ((today-timezone)/86400-
  6.                         (sbuf.st_ctime-timezone)/86400)>0) mode="w";
  7.                 efd=freopen(LOGFILE,mode,stderr);
  8.                 if(efd) {
  9.                         fd=fileno(efd);
  10.                         fflag=fcntl(fd,F_GETFL,0);
  11.                         if(fflag>=0)
  12.                         ret=fcntl(fd,F_SETFL,fflag|O_DSYNC);
  13.                         pthread_mutex_unlock(&log_mutex);
  14.                         return 1;
  15.                 } else {
  16.                         fprintf(stderr,"open logfile %s:errno=%d,%s\n",
  17.                                 LOGFILE,errno,strerror(errno));
  18.                         efd=freopen("/dev/null","w",stderr);
  19.                 }
  20.         }
  21.         fflush(stderr);
  22.         fseek(stderr,0,SEEK_END);
  23.         pthread_mutex_unlock(&log_mutex);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP