2012-02-14 2 views
1

Я работаю над рудиментарной оболочкой, но в цикле ниже программа не проходит мимо выделенной строки (она сразу же зацикливается). Когда я прокомментирую это, весь блок завершается до повторения цикла. Что тут происходит?Почему cout предотвращает запуск следующего кода?

#include <iostream> 
#include <string> 
#include <stdlib.h> 
using namespace std; 

int main(int argc, char *argv[]) { 
    string input; 
    const char *EOF="exit"; 
    string prompt=getenv("USER"); 
    prompt.append("@ash>");                    

    while(true) { 
    int parent=fork(); 
    if (!parent) { 
     cout << prompt; //The program never gets past this point 
     getline(cin,input); 
     if (!input.compare(EOF)) 
     exit(0); 
     cout << input << '\n';                    
     execlp("ls", "-l", NULL); 
     return 0; 
    } 
    else 
     wait(); 
    } 
} 
+0

Это должно быть помечен C++ не с. – Hersha

+0

Вы правы, хорошо поймайте. – user1209326

+0

Это отлично работает для меня ... –

ответ

6

Добавьте эти #include S:

#include <sys/types.h> 
#include <sys/wait.h> 

затем вызовите wait(2) правильно:

int status; 
wait(&status); 

Ваш код, wait(), не вызывается wait(2) системный вызов. Скорее, он объявляет временный объект типа union wait. Если вы #includestdlib.h, но не sys/wait.h, тогда вы получите только объявление типа, а не объявление функции.

Кстати, если бы вы проверили возвращаемое значение wait вызова: int result = wait(), вы получили бы информативное сообщение об ошибке:

xsh.cc:26: error: cannot convert ‘wait’ to ‘int’ in initialization

+0

Вы имеете в виду ожидание вне цикла? Каков недостаток способа кодирования прямо сейчас (законно любопытно, это было всегда, как показал наш инструктор) – user1209326

+1

** EDIT: ** просто увидел ваше редактирование. Должно быть, я просто был сумасшедшим. Спасибо! – user1209326

+0

Мое редактирование технически неверно. Конфликтный символ не из 'std :: wait', это' union wait', который предоставляется в 'stdlib.h'. Я обновлю свое редактирование. –

Смежные вопросы