В дополнение к Ответ Игнасио Васкеса-Абрама , я предлагаю вам эмулировать модель переднего плана / фона оболочки.
Насколько я могу судить, создание фона для процесса означает его приостановку.Самый простой способ сделать это через SIGSTOP
.Когда вы на переднем плане процесса, отправьте его SIGCONT
.Пока только одна из ваших «заданий» в настоящее время находится на переднем плане, это будет единственное чтение и запись в сеанс tty
.
kill(child_pid, SIGSTOP);
kill(child_pid, SIGCONT);
Возможно, вы захотите приостановить каждый процесс после того, как выfork
, и перед вами execv
, и предоставьте пользователю вашей оболочки возможность затемнять их позже для поддержки инварианта.
if (!fork()) { // we are the child
raise(SIGSTOP); // suspend self
execv(...); // run the command (after we've been resumed)
Вот несколько связанных ссылок, которые я нашел: