Код: Выделить всё
#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;
}

поэтому когда я начал тестирование, я заметил, что созданные процессы ведут себя странно (завершаются раньше, чем должны, я добавил часть кода, которая должна выполняться дочерними процессами), я решил проверить, попадают ли они в shced() , и оказалось, что ни один из них иди туда. После этого я решил проверить, какого они типа, и добавил в системный вызов следующие выводы:
Код: Выделить всё
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
Мобильная версия