2016-04-06 3 views
1

Я реализую простую родительскую/дочернюю программу процесса с использованием fork. Моя цель - создать входной номер пользователя дочерних процессов из одного родителя и сохранить их PID в динамическом массиве. Мне удается создать дочерние процессы (я думаю), используя fork и храня их PIDS. Однако, когда я храню PID, я также сохраняю 0 PID и то, что я считаю другим PID, связанным с процессами, но это число намного больше, чем дочерний и родительский.Несколько дочерних процессов из одного родительского процесса

Как это происходит, когда ясно, что это делается только в родительском процессе?

void createProcesses(int nProcess) { 
    int i; 
    int PID; 
    processIDS = calloc(nProcess, sizeof(long)); 

    printf("*****Creating Processes*****\n"); 

    printf("Parent Process: PID %d\n", getpid()); 
    for (i = 0; i < nProcess; i++) { 
    PID = fork(); 
    if (PID == 0) { 
     printf("Child Process: PID %d\n", getpid()); 
     while(1){} 
    } 
    else if(PID != 0) { 
     // sleep(3); 
     // printf("Number of child processes created: %d\n", nProcess); 
     // updateProcessList(); 
     *(processIDS + i) = PID; 
     printf("%d\n", PID); 
    } 
    } 
    for(i = 0; i < sizeof(processIDS); i++) { 
    printf("%ld\n", *(processIDS + i)); 
    } 
    while(1) { 
    sleep(5); 
    updateProcessList(); 
    } 
} 

processIDS is a long * global variable. 

ответ

5

Проблема здесь:

for(i = 0; i < sizeof(processIDS); i++) { 
    printf("%ld\n", *(processIDS + i)); 
    } 

Поскольку processIDS является указателем, то размер размер long *, вероятно, 4 или 8, который не то, что вы хотите. Если значение nProcess меньше этого, вы будете считывать конец динамически выделенного массива, вызывая неопределенное поведение.

Вы знаете, что есть nProcess процессы, созданные, поэтому использовать его для тестирования контура:

for(i = 0; i < nProcess; i++) { 
    printf("%ld\n", *(processIDS + i)); 
    } 
+3

рассмотреть также с помощью 'processIDs [я]', это намного легче читать, чем вариант указателей. – unwind

Смежные вопросы