Fork() создает дочерний процесс другого типа в minix2Linux

Ответить
Anonymous
 Fork() создает дочерний процесс другого типа в minix2

Сообщение Anonymous »

Я пытаюсь реализовать планировщик групповых приоритетов в minix2 и столкнулся с некоторыми проблемами. У меня есть тестовый скрипт:

Код: Выделить всё

#include 
#include 
#include 

int main() {
message m;
int grp = 2;
int add_prior = 2;
time_t exec_time = 10;
int counter = 1;
pid_t main_pr = getpid();

printf("mainPID: %d\n", getpid());

for(counter; counter  24) {
add_prior = 2;
}
m.M1_i2 = (grp % 4) * 25 - add_prior;
m.M1_i3 = exec_time;
if(getpid() == main_pr) {
m.M2_l1 = fork();
if(m.M2_l1 > 0) {
_syscall(MM, DO_SETPRI, &m);
}
}
add_prior++;
exec_time++;
grp++;
sleep(1);
}

return 0;
}
и скриншот:
Изображение

Все, что он делает, — это создает несколько процессов и настраиваемые параметры для них. Для каждого процесса он выполняет системный вызов, который устанавливает пользовательские поля.
И системный вызов:

Код: Выделить всё

PRIVATE int do_setprio(m_ptr)
register message *m_ptr;
{
struct proc *child_proc;

// printf(" M2_l1:%d M1_i1:%d\n", m_ptr->M2_l1, m_ptr->M1_i1);
child_proc = proc_addr(m_ptr->M2_l1);

if (isuserp(child_proc)) { printf("\n user \n"); }
if (istaskp(child_proc)) { printf("\n task \n"); }
if (isservp(child_proc)) { printf("\n serv \n"); }

child_proc->pr_grp = m_ptr->M1_i1;
child_proc->pr_priority= m_ptr->M1_i2;
child_proc->pr_exec_time= m_ptr->M1_i3;

printf("Data of created process: PID:%d GRP:%d PRIOR:%d \n", m_ptr->M2_l1, child_proc->pr_grp, child_proc->pr_priority);
return 0;
}
и скриншот:
Изображение

Итак, когда я начал тестирование, я заметил, что созданные процессы ведут себя странно (завершаются раньше, чем должны; я добавил часть кода, которая должна выполняться дочерними процессами). Я решил проверить, попадают ли они в sched(), и оказалось, что никто из них туда не заходит. После этого я решил проверить, какого они типа, и добавил в системный вызов такие выводы:

Код: Выделить всё

if (isuserp(child_proc)) { printf("\n user \n"); }
if (istaskp(child_proc)) { printf("\n task \n"); }
if (isservp(child_proc)) { printf("\n serv \n"); }
и получил очень интересный результат (скриншот):
Изображение

Как видите, некоторые процессы от одного родителя могут быть как пользовательскими, так и системными типами, другие вообще не имеют типа или простаивают, а кроме того, ядро ​​начало глючить паника (чего не было до этих логов). Пытался исправить самостоятельно, но долго не мог понять в чём проблема и что здесь происходит, поэтому прошу вашей помощи и совета.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-minix2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»