免费注册 查看新帖 |

Chinaunix

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

如何限制同一时刻的fork的最大数量?一定要用共享内存吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-05-20 15:01 |只看该作者

如何限制同一时刻的fork的最大数量?一定要用共享内存吗?

我修改了一下,但是运行还是不对,不知道哪里错了

  1. #include        <stdio.h>;
  2. #include        <stdlib.h>;
  3. #include        <time.h>;
  4. #include        <unistd.h>;
  5. #include        <sys/types.h>;
  6. #include        <sys/ipc.h>;
  7. #include        <sys/shm.h>;

  8. main()
  9. {
  10.         int        fknbr = 0;
  11.         key_t        key;
  12.         int        shmid;
  13.         int        ret;
  14.         char        *shmbuf;

  15.         key = ftok( "/", 'J' );
  16.         if( key == -1 )
  17.         {
  18.                 fprintf( stderr, "ftok() failed!\n" );
  19.                 return ;
  20.         }

  21.         shmid = shmget( key, 1024, IPC_CREAT | 0666 );
  22.         if( shmid == -1 )
  23.         {
  24.                 fprintf( stderr, "Get shared memory failed!\n" );
  25.                 return ;
  26.         }

  27.         shmbuf = NULL;
  28.         shmbuf = shmat( shmid, NULL, 0 );
  29.         if( shmbuf == NULL )
  30.         {
  31.                 fprintf( stderr, "Attach shared memory failed!\n" );
  32.                 return;
  33.         }

  34.         sprintf( shmbuf, "%d", fknbr );
  35.         fprintf( stderr, "Shared memory writed success![%s]\n", shmbuf );

  36.         ret = shmdt( shmbuf );
  37.         if( ret == -1 )
  38.         {
  39.                 fprintf( stderr, "Detach shared memory failed!\n" );
  40.                 return;
  41.         }

  42.         for( ; ; )
  43.         {
  44.                 shmbuf = shmat( shmid, NULL, SHM_RDONLY );
  45.                 if ( shmbuf == NULL )
  46.                 {
  47.                         fprintf( stderr, "Attach shared memory failed!\n" );
  48.                         return;
  49.                 }

  50.                 fknbr = atoi( shmbuf );
  51.                 fprintf( stderr, "Read from shmbuf fknbr=[%d]\n", fknbr );

  52.                 ret = shmdt( shmbuf );
  53.                 if ( ret == -1 )
  54.                 {
  55.                         fprintf( stderr, "Detach shared memory failed!\n" );
  56.                         return;
  57.                 }

  58.                 if( fknbr >; 3 )
  59.                 {
  60.                         printf( "Busy now! fknbr:[%d]\n", fknbr );
  61.                         sleep( 5 );
  62.                 }

  63.                 if( ( fork() == 0 ) && ( fknbr < 4 ) )
  64.                 {
  65.                         fknbr++;
  66.                         printf( "Process fknbr:[%d]\n", fknbr );
  67.                         sleep( 3 );
  68.                         fknbr--;

  69.                         shmbuf = NULL;
  70.                         shmbuf = shmat( shmid, NULL, 0 );
  71.                         if( shmbuf == NULL )
  72.                         {
  73.                                 fprintf( stderr, "Attach shared memory failed!\n" );
  74.                                 return;
  75.                         }

  76.                         sprintf( shmbuf, "%d", fknbr );
  77.                         fprintf( stderr, "Shared memory writed success in Process![%s]\n", shmbuf );

  78.                         ret = shmdt( shmbuf );
  79.                         if( ret == -1 )
  80.                         {
  81.                                 fprintf( stderr, "Detach shared memory failed!\n" );
  82.                                 return;
  83.                         }

  84.                         exit( 0 );
  85.                 }

  86.         }
  87. }
复制代码

刚看了看共享内存,抄了一段,好像不太对,不知道哪里错了

论坛徽章:
0
12 [报告]
发表于 2003-05-20 18:40 |只看该作者

如何限制同一时刻的fork的最大数量?一定要用共享内存吗?

这种场合不适合使用共享内存,因为你没有合适的阻塞手段。
你可以利用信号灯定义出PV操作,然后在fork之前调用P操作,如果信号灯的值等于零,进程会自然阻塞,直到有哪个子进程推出之前调用V操作为止。
这个地方不要考虑shm,不合适,太麻烦!

修改:不是不合适,而是根本就不应该使用shm。shm只能提供数据通讯,不能实现互斥。

伪代码定义:

  1. ……
  2. P()
  3. {
  4.         信号量--; /*用semop()实现*/
  5. }

  6. V()
  7. {
  8.         信号量++; /*用semop()实现*/
  9. }

  10. 初始化信号量=50;
  11. for (i=0;i<1000;i++) {
  12.         P();  /* 当信号量=0时,这里会自然阻塞! */
  13.         if (fork()==0) {
  14.                 做点事情;
  15.                 V();
  16.                 exit(0);
  17.         }
  18. }
  19. ……
复制代码

论坛徽章:
0
13 [报告]
发表于 2003-10-31 14:34 |只看该作者

如何限制同一时刻的fork的最大数量?一定要用共享内存吗?

刚看了看共享内存,抄了一段,好像不太对,不知道哪里错了

你没有将改变的数字写回去
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP