Я пытаюсь создать простую "верхнюю" программу, разветвляя дочерний элемент в качестве таймера, затем включая (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 ()?