2013-05-01 336 views
-2

关于进程动态池的问题。我需要保留自由进程的信息。如果免费进程的数量少于N,我应该创建新的进程。但是,我知道free变量在每个过程中都是相同的。如何使free变量为“全局”,并且在子进程中进行更改将会在父进程中更改变量,然后父进程可以检查该进程并让更多子进程进行更改?像共享内存和其他IPC一样。一点困惑与他们。父进程和子进程的全局变量

free=5; 
for (i=0;i<5;i++) // create 5 pre-forks 
    { 
     pid=fork(); 
     if (pid==0) //child 
     { 
      break; 
     } 
     else//parent 
     { 

     } 
    } 

    while (1) 
    { 
     if (pid==0) // child 
     { 
      newsock = accept(listensock, NULL,NULL); 
      free--; //children is busy 
      send(newsock, buffer, nread, 0); 
      close(newsock); 
      free++; 
     } 
     else if (pid>0) // parent 
     { 
      if ...// if less than n fork() more 
     } 
    } 
+2

你回答了你自己的问题。你可以使用共享内存。在网上查找有关共享内存的文档。如果你想在正在运行的实体之间共享地址空间,请使用线程。如果你使用线程,如果你使用互斥量,他们可以安全地共享共享内存。 – bspikol 2013-05-01 12:45:20

回答

0

正如您所说的,您可以使用共享内存来存储不同进程之间共享的变量。其中一个进程必须创建该共享内存与shmget

shmget需要一个密钥来标识共享内存区域,大小和一些其他选项。创建的常见选项是IPCCREAT | 0666以使用unix权限创建它0666

其他进程调用shmget并将0作为使用已初始化段的最后一个参数。

处理方向空间与共享内存进行连接,你必须使用shmat

例子:

#define KEY ((key_t) 1234) //Any value, just dont overlap other applications in the machine 
#define SIZE sizeof(int) 

int* free; 

int id = shmget(KEY, SIZE, IPCCREAT | 0666); 
if (id < 0) //Error... 

free = (int*) shmat(id, 0, 0); 
if (free <= (int*)(0)) // shmat failed... 

//At this point, you can use free as a normal variable 
*free = 5; 
*free++; 
... 
//As various processes can access free, you must use any control mechanism (mutex, semaphores...) 

shmdt(id); //Unlink shared memory segment 
+0

您确实应该使用POSIX'shm_open()'来代替。使用起来更容易,不太可能发生重大冲突。 – Hasturkun 2013-05-01 13:14:50

+1

共享内存是硬变体,可以使用pipe()解决吗? – 2013-05-01 13:20:53

+0

@NatKup管道是两个进程之间的单向连接。你有N个具有双向通信的进程,如果你不使用线程,共享内存就是要走的路。 – Evans 2013-05-01 13:39:29