父进程和子进程中的全局变量

global variable in parent and children processes

本文关键字:全局变量 子进程 进程      更新时间:2023-10-16

关于进程动态池的问题。我需要保留自由进程的信息。如果空闲进程数小于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
        }
    }

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

创建共享内存。

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

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

连接进程方向空间和共享内存,必须使用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