Я работаю над созданием базовой оболочки. Я застрял при попытке получить exec () для чтения из входного файла. Вот что у меня есть. Я не уверен, какие аргументы я должен приводить execvp (). Здесь stringList [0] будет чем-то вроде «ls» или «cat». Если stringList [0] равен ls, файл будет содержать что-то похожее на ls -a -l
int fd = open(iFile, O_RDONLY);
dup2(fd, 0);
close(fd);
execvp(stringList[0], ...);
cout << "Exec error!\n";
exit(1);
Похоже, вы хотите прочитать команду из файла и затем выполнить эту команду. Если это ваша цель, вы должны выполнять оболочка.
Ваш текущий подход open
затем dup2
не вызывает exec
читать из файла, потому что exec
никогда не читает со стандартного ввода. Он читает только из исполняемого файла (для загрузки образа программы). То, что делает ваш текущий подход, это переадресовывать вход, так что если exec
успешно, новая программа будет иметь iFile
как его стандартный входной файл.
Вы можете просто сделать это:
execl(shell, basename(shell), iFile, (char*)0);
Пример: если iFile
это строка "myCommand.sh"
, а также shell
является /bin/bash
, затем basename(shell)
дает bash
, и это похоже на запуск этого в командной строке:
$ bash myCommand.sh
За shell
вы, вероятно, хотите использовать оболочку текущего пользователя по умолчанию. Вы можете получить эту информацию, используя getpwuid
или же getpwuid_r
,
Других решений пока нет …