Почему cout препятствует запуску следующего кода здесь? - PullRequest
1 голос
/ 14 февраля 2012

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

#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();
  }
}

1 Ответ

6 голосов
/ 14 февраля 2012

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

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

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

int status;
wait(&status);

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

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

xsh.cc: 26: ошибка: невозможно преобразовать «wait» в «int» при инициализации

...