父进程和子进程的全局变量
问题描述:
关于进程动态池的问题。我需要保留*进程的信息。如果免费进程的数量少于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
其他进程调用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
你回答了你自己的问题。你可以使用共享内存。在网上查找有关共享内存的文档。如果你想在正在运行的实体之间共享地址空间,请使用线程。如果你使用线程,如果你使用互斥量,他们可以安全地共享共享内存。 – bspikol 2013-05-01 12:45:20