免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12429 | 回复: 11
打印 上一主题 下一主题

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

论坛徽章:
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
1 [报告]
发表于 2011-06-24 10:49 |显示全部楼层
get_fp没细看。是想在每个子进程中写文件然后再关闭吗?您的while放在pid==0,就是else后面的{}里吧,现在这么写是父子进程都执行while里的,所以乱了。

论坛徽章:
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
2 [报告]
发表于 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. }
复制代码

论坛徽章:
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
3 [报告]
发表于 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
4 [报告]
发表于 2011-06-24 16:23 |显示全部楼层
难道是想把fork()放到get_fp里?

论坛徽章:
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
5 [报告]
发表于 2011-06-24 16:56 |显示全部楼层
本帖最后由 cokeboL 于 2011-06-24 16:57 编辑

回复 10# sumland
  1. while(1)

  2. {        
  3. ...//略去        
  4.         pid_t pid;
  5.   pid=fork();
  6.   if(pid<0)
  7.         {
  8.         close(nConnectSocket);
  9.                                 continue;
  10.         }
  11.         else if(pid>0)
  12.         {
  13.               close(nConnectSocket);   
  14.                                 continue;      
  15.         while(i<120)
  16.                 {
  17.                 i++;
  18.                 sleep(1);
  19.                 get_fp(&NowFp,str);
  20.                 }        
  21.         }                           
  22. }

复制代码
pid判断那块是不是少了else(pid == 0 )的情况?否则这逻辑不对啊,while里的那个while能执行到吗?不是continue了吗?
如果是少了的话,看这段代码,楼主fork()的子进程做的事情应该是继承了第一次循环之后的代码,然后子进程fork()的子进程也是,如此循环,会又子子孙孙循环fork()和get_fp的情况吧?那自然就有很多个进程在比较自己的nowtime和creattime满足>=10的时候创建文件了。也就是说这个fork()创建的子进程除了对程序破坏并没有进行有意义的活动。干脆把fork()去掉算了,就要达到的目的来说,没必要用多进程的感觉,楼主试试。如果非要多进程,那试试
  1. while(1)

  2. {        
  3. ...//略去        
  4.         pid_t pid;
  5.   pid=fork();
  6.   if(pid<0)
  7.         {
  8.         close(nConnectSocket);
  9.                                 continue;
  10.         }
  11.         else if(pid>0)
  12.         {
  13.                close(nConnectSocket);   
  14.                                 continue;   
  15.        }
  16.        else{
  17.         while(i<120)
  18.                 {
  19.                 i++;
  20.                 sleep(1);
  21.                 get_fp(&NowFp,str);
  22.                 }        
  23.         }                     
  24. }
复制代码

论坛徽章:
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
6 [报告]
发表于 2011-06-24 17:36 |显示全部楼层
回复 12# sumland


    我截的就是你10楼的,也是照10楼改的,你仔细看下哈

论坛徽章:
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
7 [报告]
发表于 2011-06-24 17:37 |显示全部楼层
回复 12# sumland


    我在11楼的回复,两段代码,上段是你10楼里的,下段是改的,中间是分析的,楼主试下按改过的能实现不

论坛徽章:
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
8 [报告]
发表于 2011-06-27 09:56 |显示全部楼层
本帖最后由 cokeboL 于 2011-06-27 10:34 编辑
不好意思,我一直没讲明白,我的目的是在子进程里执行那个get_fp,还是要保证get_fp执行完一次之后才再执行 ...
sumland 发表于 2011-06-27 09:25



我很郁闷,我改的就是在子进程里执行get_fp();而且根据你前面get_fp()的代码,应该是子进程执行它但根据时间间隔来判断是否新建文件,而不是你说的“我的目的是在子进程里执行那个get_fp,还是要保证get_fp执行完一次之后才再执行 ...”,否则你get_fp()的代码就可以裁掉一些。如果是要“保证get_fp执行完一次之后才再执行”,时间间隔的判断就该挪到外边或者添加其他flag对多进程间进行同步。你对文件写入的操作没说清楚,个人感觉get_fp()的实现和你的要求之间有些矛盾。

给点建议撒:
  1. 1.请尽量理清自己要问的问题;
  2.             
  3. 2.别人的认真的回复也请仔细看下,否则,假如你对多进程不熟悉,别人给你改了,你都不看,你还是按自己原来可能是错误的只是来理解,那别人怎么弄都无法达到  你要求;
  4.             
  5. 3.另外,回帖子请点回复或引用撒,否则系统没有提示,别人再浏览这帖子才能发现你回复了。

  6. 4.如果回帖对你没用,可以直接无视。
复制代码
好吧,我放弃了。

论坛徽章:
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
9 [报告]
发表于 2011-06-27 13:37 |显示全部楼层
回复 17# sumland


原因我已经回复过了,你不看。。。你对fork的基本用法都不太懂,pid == 0 和 > 0 你仔细考虑过吗?子进程继承了什么,从什么地方开始继承你都弄明白了吗? 不懂又不看回复,或者看了又不去思考和弄明白你不懂的地方,那怎么搞?又不是在一起工作,谁能一个字一个字把书上东西都敲给你啊。。。

论坛徽章:
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
10 [报告]
发表于 2011-06-27 13:58 |显示全部楼层
回复  cokeboL


    谢谢回复!我只希望通过问问题能得到些启发,比如你说的进程同步,我还是想弄清楚 ...
sumland 发表于 2011-06-27 12:15



父子进程,举个例子吧:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. int main()
  5. {
  6.     pid_t pid;

  7.     while(1){
  8.         pid=fork();
  9.         if( pid < 0 )
  10.             perror("fork"), exit(-1);
  11.         else if( pid > 0 )
  12.             exit(0);
  13.         else if( pid == 0 ){
  14.             printf("child\n");
  15.             sleep(1);
  16.         }
  17.     }
  18. }
复制代码
你猜一下执行结果打印几次child,然后执行一下,为什么这样?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP