免费注册 查看新帖 |

Chinaunix

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

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

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

论坛徽章:
0
12 [报告]
发表于 2011-06-24 17:16 |只看该作者
回复 11# cokeboL


    这个实际是省略了socket会话过程的代码。fork子进程是不能去掉的。请看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
13 [报告]
发表于 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
14 [报告]
发表于 2011-06-24 17:37 |只看该作者
回复 12# sumland


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

论坛徽章:
0
15 [报告]
发表于 2011-06-27 09:25 |只看该作者
不好意思,我一直没讲明白,我的目的是在子进程里执行那个get_fp,还是要保证get_fp执行完一次之后才再执行另一个子进程的get_fp,不能让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
16 [报告]
发表于 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.如果回帖对你没用,可以直接无视。
复制代码
好吧,我放弃了。

论坛徽章:
0
17 [报告]
发表于 2011-06-27 12:15 |只看该作者
回复 16# cokeboL


    谢谢回复!我只希望通过问问题能得到些启发,比如你说的进程同步,我还是想弄清楚到底是什么原因 导致了在同一时间不同进程都创建了文件。

论坛徽章:
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
18 [报告]
发表于 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
19 [报告]
发表于 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,然后执行一下,为什么这样?

论坛徽章:
0
20 [报告]
发表于 2011-06-28 09:25 |只看该作者
回复 19# cokeboL


    这个可以执行吗?现在很怕无限执行fork!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP