Как ждать внутри системного вызова в Minix 3
Мне нужно реализовать системный вызов внутри minix, который ждет, пока какое-либо условие не станет истинным, прежде чем оно вернется. Тем не менее, я обнаружил, что просто пытается что-то вроде
while (var != desired_value)
{
// wait
}
не работает, потому что, хотя он блокирует процесс, он также блокирует все остальные процессы, запущенные в minix. Я даже не могу переключиться на другой виртуальный терминал и войти в систему. Я думал, что процессы minix должны были работать независимо друг от друга, но похоже, что когда какие-либо процессы блокируются при системном вызове, все другие процессы одновременно приостанавливаются. Это может быть правильно? Спасибо
1 ответ
Системные вызовы Minix являются атомарными процедурами, это означает, что они не могут быть прерваны даже планировщиком. Ожидание невыполнимого условия приведет к тупику.
Конечно, в Minix есть неблокирующий механизм ожидания:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int options)
wait
вызывает задержку вызывающей стороны до тех пор, пока не будет получен сигнал или один из его дочерних процессов не завершится.
waitpid
предоставляет альтернативный интерфейс для программ, которые не должны блокироваться при сборе статуса дочерних процессов или которые хотят ждать одного конкретного дочернего процесса.
Minix предоставляет POSIX, так что вы можете использовать fork
, exec
и т. д. для управления процессами.