2014-10-02 40 views
0

我已經分叉了幾次,並在C中創建了一堆子進程。我想將它們的所有PID存儲在共享數組中。 PID的順序無關緊要。例如,我創建了32個進程。我想有一個32位整型數組,可以存儲每個PID,並且可以通過這些進程訪問每個進程。什麼可能是最好的方式來做到這一點。創建進程的多個子進程並維護其所有PID的共享陣列

+0

看看這個http://stackoverflow.com/questions/9147760/how-to-get-child-pid- in-c你應該能夠將該值存儲在任何選擇的數組中。 – prasanna 2014-10-02 13:13:04

+0

你用fork(2)調用fork了嗎?如果是這樣,子進程將有一個新的地址空間,所以沒有共享內存。如果你真的想這樣做,你必須以其他方式創建一個共享內存映射,例如在第一次fork()之前打開的文件描述符上使用mmap()。然後,您可以將每個fork()的返回值存儲在該區域中(它將在父線程中返回子進程PID,並在子線程中返回0)。你應該探索使用pthreads而不是fork,如果你需要共享內存,它的資源密集度也較低,並且有互斥鎖等。 – ThomasH 2014-10-02 13:19:34

+0

你需要使用'mmap'。但是對於子流程來說,知道它們是哪個索引還是更好。 – HuStmpHrrr 2014-10-02 13:30:08

回答

2

這裏有一個程序,說明您想使用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); 
} 
+0

非常感謝。這段代碼真的有幫助! – user4102404 2014-10-03 05:23:18

相關問題