父进程和子进程中的全局变量
global variable in parent and children processes
关于进程动态池的问题。我需要保留自由进程的信息。如果空闲进程数小于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
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- 终止 QProcess 不会终止子进程
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- 库中由单个进程的多个实体链接的全局变量
- 多进程 c++(11),链表指针作为全局变量
- 我们可以从父进程读取子进程的环境变量吗
- 父进程和子进程中的全局变量
- c++ WIN API:当使用CreateProcess创建子进程时,我需要使输入参数具有全局生存期吗?
- 如何使子进程具有与 parrent 相同的环境变量,并在窗口中拥有自己的环境变量?