ОБНОВЛЕНИЕ: был очевидный шаг отладки, который я забыл.Что произойдет, если я попробую команду типа ps &
в обычной старой оболочке bash?Ответ в том, что я вижу то же самое поведение.Например:
[ahoffer@uw1-320-21 ~/program1]$ ps &
[1] 30166
[ahoffer@uw1-320-21 ~/program1]$ PID TTY TIME CMD
26423 pts/0 00:00:00 bash
30166 pts/0 00:00:00 ps
<no prompt!>
Если я затем нажму Enter, командная оболочка сообщит о состоянии выхода, а консоль отобразит состояние выхода и приглашение:
[ahoffer@uw1-320-21 ~/program1]$ ps&
[1] 30166
[ahoffer@uw1-320-21 ~/program1]$ PID TTY TIME CMD
26423 pts/0 00:00:00 bash
30166 pts/0 00:00:00 ps
[1] Done ps
[ahoffer@uw1-320-21 ~/program1]$
PS: я используюPuttY для доступа к машине Linux через SSH через порт 22.
ОРИГИНАЛЬНЫЙ ВОПРОС: Я работаю над домашним заданием.Задача состоит в том, чтобы реализовать часть интерпретатора командной оболочки в Linux с использованием таких функций, как fork (), exec ().У меня странная ошибка, которая возникает, когда мой код выполняет команду в качестве фонового процесса.
Например, в приведенном ниже коде команда ls
правильно выполняет ls и выводит свой вывод на консоль.Когда команда завершена, цикл обработки событий в вызывающем коде правильно выводит на консоль приглашение «%».
Однако, когда выполняется ls &
, ls
выполняется правильно, и его выводвыводится на консольОднако подсказка «%» никогда не печатается!
Код прост.Вот как выглядит псевдокод:
int child_pid;
if ( (child_pid=fork()) == 0 ) {
//child process
...execute the command...
}
else {
//Parent process
if( delim == ';' )
waidpid(child_pid);
}
//end of function.
Родительский процесс блокируется, если разделитель - точка с запятой.В противном случае функция завершается, и код повторно входит в цикл обработки событий.Однако, если родительский модуль спит во время выполнения фоновой команды, приглашение отображается правильно:
...
//Parent process
if( delim == ';' ) {
waidpid(child_pid)
}
else if( delim == '&' ) {
sleep(1);
//The prompt, " %", is correctly printed to the
// console when the parent wakes up.
}
Никто в классе не знает, почему это происходит.ОС RedHat Enterprise 5, компилятор g ++.