Невозможно получить доступ к общей переменной parent от child - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь создать простую "верхнюю" программу, разветвляя дочерний элемент в качестве таймера, затем включая (i_interval) в дочернем элементе и печатая каждый интервал пробуждения. Основная программа всегда запускает смещенный планировщик RR, который дает каждому процессу распределение ЦП. Дочерний объект, который имеет таймер, в основном делает это:

while (1)
{
    usleep(i_interval);
    print_top(process_queue);
}

очередь процесса - это структура, содержащая информацию, которую я хочу напечатать, а именно PID / COMMAND / TIME /% CPU. Чтобы поделиться переменными, которые я изменяю в родительском, с дочерним таймером, я создал общую структуру, например, так:

typedef struct process_context
{
    pid_t pid;
    char *command;
    int proportion;
    int proportion_cpu;
    int total_time;
    int order;
} process_context_t;

static process_context_t *process_queue;
process_queue = mmap(NULL, 
   sizeof(process_context_t *) * schedulees_count, 
   PROT_READ | PROT_WRITE,
   MAP_SHARED | MAP_ANONYMOUS, -1, 0);

потом дочерний процесс вызывает функцию из родительского процесса

void print_top(process_context_t *process_queue)

, которая печатает всю необходимую информацию. Проблема, однако, заключается в том, что когда я добираюсь до этой части, секции print_top:

printf("test 1\n");
while (process_queue[l].pid != -1) {
    printf("test1.5\n");
    num_process++;
    l++;
}
printf("test 2\n");

первый printf работает, но все остальное после этого из функции больше не работает. Я предполагаю, что какая-то ошибка доступа возникает в process_queue [l] .pid?

Тем не менее, когда я попробовал тестовую программу, использующую аналогичную структуру, она работала нормально

typedef struct test_struct
{
    int test_val;
} test_struct_t;

test_struct_t *test_struct;

int main() {
    test_struct = mmap(NULL, sizeof(test_struct_t *) * 2, PROT_READ | PROT_WRITE,
                         MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    test_struct[0].test_val = 0;
    test_struct[1].test_val = 999;

    pid_t pid;

    if ((pid = fork()) == -1) {
        perror("bad fork");
    } else if (pid == 0) {
        while (1) {
            usleep(100000);
            printf("big %d\n", test_struct[1].test_val);
        }
    }

    if ((pid = fork()) == -1) {
        perror("bad fork");
    } else if (pid == 0) {
        while (1) {
            usleep(300000);
            printf("small %d\n", test_struct[0].test_val);
        }
    }

    while(1) {
        usleep(1000000);

        test_struct[0].test_val++;
        test_struct[1].test_val--;

    }
}

Не точно, что я здесь делаю неправильно, как я могу правильно поделиться структурой process_queue, чтобы ребенок мог использовать ее для печати каждого usleep ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...