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

C++ 父进程和子进程中的全局变量,c++,c,linux,unix,process,C++,C,Linux,Unix,Process,关于进程动态池的问题。我需要保留自由进程的信息。如果空闲进程的计数小于N,我应该创建新进程。但是,我知道free变量在每个过程中都是相同的。如何使自由变量成为“全局”变量,并且子进程中的更改将更改父进程中的变量,然后父进程可以检查此项并生成更多子进程?比如共享内存和其他IPC。我对他们有点困惑 free=5; for (i=0;i<5;i++) // create 5 pre-forks { pid=fork(); if (pid==0) //c

关于进程动态池的问题。我需要保留自由进程的信息。如果空闲进程的计数小于
N
,我应该创建新进程。但是,我知道
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
        }
    }
free=5;
对于(i=0;i0)//父
{
if…//如果小于n fork()更多
}
}

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

shmget需要一个键来标识共享内存区域、大小和一些附加选项。create的常见选项是
ipcreate | 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
#define KEY((KEY_t)1234)//任何值,只是不要与机器中的其他应用程序重叠
#定义大小sizeof(int)
int*免费;
int id=shmget(键、大小、IPCCREAT | 0666);
if(id<0)//错误。。。
free=(int*)shmat(id,0,0);

if(free)你回答了你自己的问题。你可以使用共享内存。只需在线查阅共享内存文档。如果你想在运行的实体之间共享地址空间,请使用线程。如果你使用线程,如果你使用互斥锁,它们可以安全地共享共享内存。你真的应该使用POSIX
shm_open()
相反。它更易于使用,而且不太可能发生密钥冲突。共享memmory是一个硬变量,可以使用pipe()解决吗?@NatKup A管道是两个进程之间的单向连接。您有N个进程具有双向通信,如果您不使用线程,共享内存是一种方式。您能用我的代码编写此代码吗?很难理解如何将其用于我的代码。请。