0
我已經分叉了幾次,並在C中創建了一堆子進程。我想將它們的所有PID存儲在共享數組中。 PID的順序無關緊要。例如,我創建了32個進程。我想有一個32位整型數組,可以存儲每個PID,並且可以通過這些進程訪問每個進程。什麼可能是最好的方式來做到這一點。創建進程的多個子進程並維護其所有PID的共享陣列
我已經分叉了幾次,並在C中創建了一堆子進程。我想將它們的所有PID存儲在共享數組中。 PID的順序無關緊要。例如,我創建了32個進程。我想有一個32位整型數組,可以存儲每個PID,並且可以通過這些進程訪問每個進程。什麼可能是最好的方式來做到這一點。創建進程的多個子進程並維護其所有PID的共享陣列
這裏有一個程序,說明您想使用mmap()什麼:
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PIDS 32
volatile pid_t *pids;
// Called for each child process
void do_child(void)
{
int c;
printf("Child: %d - pid array: ", getpid());
for (c=0; c<10; c++) {
printf("%d%s", pids[c], c==9?"\n":" ");
}
}
int main(int argc, char **argv)
{
int c;
pid_t pid;
// Map space for shared array
pids = mmap(0, MAX_PIDS*sizeof(pid_t), PROT_READ|PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (!pids) {
perror("mmap failed");
exit(1);
}
memset((void *)pids, 0, MAX_PIDS*sizeof(pid_t));
// Fork children
for (c=0; c<10; c++) {
pid = fork();
if (pid == 0) {
// Child process
do_child();
exit(0);
} else if (pid < 0) {
perror("fork failed");
} else {
// Store in global array for children to see
pids[c] = pid;
sleep(1);
}
}
exit(0);
}
非常感謝。這段代碼真的有幫助! – user4102404 2014-10-03 05:23:18
看看這個http://stackoverflow.com/questions/9147760/how-to-get-child-pid- in-c你應該能夠將該值存儲在任何選擇的數組中。 – prasanna 2014-10-02 13:13:04
你用fork(2)調用fork了嗎?如果是這樣,子進程將有一個新的地址空間,所以沒有共享內存。如果你真的想這樣做,你必須以其他方式創建一個共享內存映射,例如在第一次fork()之前打開的文件描述符上使用mmap()。然後,您可以將每個fork()的返回值存儲在該區域中(它將在父線程中返回子進程PID,並在子線程中返回0)。你應該探索使用pthreads而不是fork,如果你需要共享內存,它的資源密集度也較低,並且有互斥鎖等。 – ThomasH 2014-10-02 13:19:34
你需要使用'mmap'。但是對於子流程來說,知道它們是哪個索引還是更好。 – HuStmpHrrr 2014-10-02 13:30:08