免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 12388 | 回复: 31

多进程文件操作 [复制链接]

论坛徽章:
0
发表于 2011-06-24 09:47 |显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<sys/types.h>
  6. #include<time.h>
  7. //这个程序的目的在于实现每隔一段时间就开一个文件,并对其写入,还要保证之前被关闭的文件不再有新的写入

  8. typedef struct myfp_info
  9. {
  10.         FILE *nfp;
  11.         time_t ncreat_time;
  12. }MYFP_INFO;

  13. int get_fp(MYFP_INFO *NowFp,char *sw)
  14. {
  15. time_t NowTime=time(NULL);


  16. if((NowTime-NowFp->ncreat_time)>=10)
  17.         {
  18.                 printf(" time up\n");
  19.                 fclose(NowFp->nfp);
  20.                 char namefile[128];
  21.                 memset(namefile,0x0,128);
  22.                 sprintf(namefile,"/opt/strtmp%d",NowTime);
  23.                 NowFp->nfp=fopen(namefile,"w+");               
  24.                 fwrite(sw,1,strlen(sw),NowFp->nfp);
  25.                 char str[]="\n\n";
  26.                 fwrite(str,1,strlen(str),NowFp->nfp);
  27.                 NowFp->ncreat_time=NowTime;         
  28.                 printf("ncreat_time1 =%d\n",NowFp->ncreat_time);
  29.         }  
  30. else
  31.         {
  32.         printf("write string:<%s>,len<%d>\n",sw,strlen(sw));
  33.         fwrite(sw,1,strlen(sw),NowFp->nfp);
  34.         char str[]="\n";
  35.         fwrite(str,1,strlen(str),NowFp->nfp);

  36.         }
  37.        
  38. return 0;                       
  39. }

  40. MYFP_INFO NowFp; //全局变量

  41. int main()
  42. {
  43. int i=0;
  44. time_t NowTime=time(NULL);
  45. char str[]="sunstring\n";
  46. NowFp.ncreat_time=NowTime;
  47. char namefile[128];
  48. memset(namefile,0x0,128);
  49. sprintf(namefile,"/opt/strtmp%d",NowTime);
  50. NowFp.nfp=fopen(namefile,"w+");
  51.        
  52. pid_t pid;
  53. pid=fork();

  54. if(pid<0)
  55.         {
  56.         printf("fork faild!\n");
  57.         exit(1);
  58.         }
  59. else if(pid>0)
  60.         {
  61.         printf("this is parrent process!child process id is:%ld\n",pid);
  62.        
  63.         }
  64. else
  65.         {
  66.         printf("this is child process!\n");               
  67.         }
  68.        
  69.        
  70.         while(i<120)
  71.                 {
  72.                 i++;
  73.                 sleep(1);
  74.                 get_fp(&NowFp,str);
  75.                 }
  76.        
  77. return 1;
  78. }
复制代码
可能因为对多进程的认识不够,才导致这个问题。请高手帮忙看看该怎么改?

论坛徽章:
0
发表于 2011-06-24 10:37 |显示全部楼层
程序没看很明白,两点建议:
1、可以用文件锁实现进程间的同步;
2、正在写和已写完的文件是否可以分目录存放?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2011-06-24 10:49 |显示全部楼层
get_fp没细看。是想在每个子进程中写文件然后再关闭吗?您的while放在pid==0,就是else后面的{}里吧,现在这么写是父子进程都执行while里的,所以乱了。

论坛徽章:
0
发表于 2011-06-24 14:53 |显示全部楼层
回复 3# cokeboL


    不是每个子进程都建文件的,只按时间来创建文件并写入。

论坛徽章:
0
发表于 2011-06-24 14:58 |显示全部楼层
回复 2# gamblegod


    我这个例子是没举好。实际情况是
  1. while(1)
  2. {
  3. ...
  4. fork();
  5. ...
  6. }
复制代码
这样的情况下,多个子进程都在同一时间创建了文件。我实际上只是需要写入一个文件,到达一定时间间隔后,再创建一个新文件写入。不知道我是否讲明白。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2011-06-24 15:37 |显示全部楼层
本帖最后由 cokeboL 于 2011-06-24 15:41 编辑
回复  gamblegod


    我这个例子是没举好。实际情况是这样的情况下,多个子进程都在同一时间创建了文 ...
sumland 发表于 2011-06-24 14:58


按我上个回复的那么改,while放在pid==0的里面就ok了。只差一个花括号的位置。我试了,ok
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<sys/types.h>
  6. #include<time.h>
  7. //这个程序的目的在于实现每隔一段时间就开一个文件,并对其写入,还要保证之前被关闭的文件不再有新的写入

  8. typedef struct myfp_info
  9. {
  10.         FILE *nfp;
  11.         time_t ncreat_time;
  12. }MYFP_INFO;

  13. int get_fp(MYFP_INFO *NowFp,char *sw)
  14. {
  15. time_t NowTime=time(NULL);


  16. if((NowTime-NowFp->ncreat_time)>=10)
  17.         {
  18.                 printf(" time up\n");
  19.                 fclose(NowFp->nfp);
  20.                 char namefile[128];
  21.                 memset(namefile,0x0,128);
  22.                 sprintf(namefile,"/opt/strtmp%d",NowTime);
  23.                 NowFp->nfp=fopen(namefile,"w+");               
  24.                 fwrite(sw,1,strlen(sw),NowFp->nfp);
  25.                 char str[]="\n\n";
  26.                 fwrite(str,1,strlen(str),NowFp->nfp);
  27.                 NowFp->ncreat_time=NowTime;         
  28.                 printf("ncreat_time1 =%d\n",NowFp->ncreat_time);
  29.         }  
  30. else{
  31.         printf("write string:<%s>,len<%d>\n",sw,strlen(sw));
  32.         fwrite(sw,1,strlen(sw),NowFp->nfp);
  33.         char str[]="\n";
  34.         fwrite(str,1,strlen(str),NowFp->nfp);

  35.         }
  36.         
  37. return 0;                        
  38. }

  39. MYFP_INFO NowFp; //全局变量

  40. int main()
  41. {
  42. int i=0;
  43. time_t NowTime=time(NULL);
  44. char str[]="sunstring\n";
  45. NowFp.ncreat_time=NowTime;
  46. char namefile[128];
  47. memset(namefile,0x0,128);
  48. sprintf(namefile,"/opt/strtmp%d",NowTime);
  49. NowFp.nfp=fopen(namefile,"w+");
  50.         
  51. pid_t pid;
  52. pid=fork();

  53. if(pid<0)
  54.         {
  55.         printf("fork faild!\n");
  56.         exit(1);
  57.         }
  58. else if(pid>0)
  59.         {
  60.         printf("this is parrent process!child process id is:%ld\n",pid);
  61.         
  62.         }
  63. else {
  64.         printf("this is child process!\n");               
  65. //} 此处原来的{去掉放下面while之后把while包进来           
  66.         
  67.         while(i<120)
  68.                 {
  69.                 i++;
  70.                 sleep(1);
  71.                 get_fp(&NowFp,str);
  72.                 }
  73. }  //就是放在这里     
  74. return 1;
  75. }
复制代码

论坛徽章:
0
发表于 2011-06-24 15:48 |显示全部楼层
我更正一下问题:就是fork了多次。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2011-06-24 16:10 |显示全部楼层
我更正一下问题:就是fork了多次。
sumland 发表于 2011-06-24 15:48



不想fork多次,那就把fork()去掉或者fork()一次但执行循环多多次。
如果需要子进程执行其他任务,那就保留fork(),在父进程中写文件。
楼主你的问题表述的让人分析起来好累,咱能一次性多说几句不。。。或者把代码多贴点,这又不算啥值钱东西

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2011-06-24 16:23 |显示全部楼层
难道是想把fork()放到get_fp里?

论坛徽章:
0
发表于 2011-06-24 16:40 |显示全部楼层
本帖最后由 sumland 于 2011-06-24 17:14 编辑

不好意思啊!我还是把整个框架贴上来吧!我也是觉得该在父进程中写文件。不过后来很多子进程都同时新建文件。我的目的是一个一个文件地创建并写入,直到给定的时间间隔,才关闭这个文件并新建,再对新文件写入,。。在每一时刻都只能有一个进程操作文件。代码稍长,而且删减了socket部分。麻烦高手看看
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<sys/types.h>
  6. #include<time.h>
  7. //这个程序的目的在于实现在实时多进程的情况下,每隔一段时间就开一个文件,并对其写入,还要保证之前被关闭的文件不再有新的写入

  8. typedef struct myfp_info
  9. {
  10.         FILE *nfp;
  11.         time_t ncreat_time;
  12. }MYFP_INFO;

  13. int get_fp(MYFP_INFO *NowFp,char *sw)
  14. {
  15. time_t NowTime=time(NULL);
  16. if((NowTime-NowFp->ncreat_time)>=10)
  17.         {
  18.                 printf(" time up\n");
  19.                 fclose(NowFp->nfp);
  20.                 char namefile[128];
  21.                 memset(namefile,0x0,128);
  22.                 sprintf(namefile,"/opt/strtmp%d",NowTime);
  23.                 NowFp->nfp=fopen(namefile,"w+");               
  24.                 fwrite(sw,1,strlen(sw),NowFp->nfp);
  25.                 char str[]="\n\n";
  26.                 fwrite(str,1,strlen(str),NowFp->nfp);
  27.                 NowFp->ncreat_time=NowTime;         
  28.                 printf("ncreat_time1 =%d\n",NowFp->ncreat_time);
  29.         }  
  30. else
  31.         {
  32.         printf("write string:<%s>,len<%d>\n",sw,strlen(sw));
  33.         fwrite(sw,1,strlen(sw),NowFp->nfp);
  34.         char str[]="\n";
  35.         fwrite(str,1,strlen(str),NowFp->nfp);
  36.         }         
  37. return 0;                        
  38. }

  39. MYFP_INFO NowFp; //全局变量

  40. int main()
  41. {
  42. {
  43.                 int nPid = fork();
  44.                 if(nPid < 0)
  45.                 {
  46.                         printf("creat daemon fail(%s)!\n", strerror(errno));
  47.                         return -1;       
  48.                 }
  49.                 if(nPid > 0)return 0;
  50.                 setsid();
  51.                 signal(SIGINT, SIG_IGN);
  52.                 signal(SIGHUP, SIG_IGN);
  53.                 signal(SIGQUIT, SIG_IGN);
  54.                 signal(SIGPIPE, SIG_IGN);
  55.                 signal(SIGTTOU, SIG_IGN);
  56.                 signal(SIGTTIN, SIG_IGN);
  57.                 signal(SIGCHLD, SIG_IGN);
  58.                 signal(SIGTERM, SIG_IGN);
  59.                 signal(SIGUSR1, SIG_IGN);
  60.                 signal(SIGUSR2, SIG_IGN);
  61.                 umask(0);
  62.                 setpgrp();
  63.         }
  64. int i=0;
  65. time_t NowTime=time(NULL);
  66. char str[]="sunstring\n";
  67. NowFp.ncreat_time=NowTime;
  68. char namefile[128];
  69. memset(namefile,0x0,128);
  70. sprintf(namefile,"/opt/strtmp%d",NowTime);
  71. NowFp.nfp=fopen(namefile,"w+");
  72. ...//socket建立过程,略去
  73. ...//
  74. while(1)
  75. {        
  76.        
  77. ...//略去       
  78. pid_t pid;
  79.   pid=fork();
  80.   if(pid<0)
  81.         {
  82.         close(nConnectSocket);
  83.         continue;
  84.         }
  85.   if(pid>0)
  86.         {
  87.                get_fp(&NowFp,str);
  88.                close(nConnectSocket);   
  89.                continue;      
  90.    
  91.         }
  92.       close(nListenSocket);
  93.       break;                     
  94. }
  95. ...//略去
  96. ...//
  97. ...//
  98. ...//
  99. return 1;

  100. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP