Реализация фоновой обработки - PullRequest
1 голос
/ 15 января 2012

ОБНОВЛЕНИЕ: был очевидный шаг отладки, который я забыл.Что произойдет, если я попробую команду типа 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 ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...