2015-10-02 6 views
1

Я работаю над созданием базовой оболочки. Я застрял в попытке получить exec() для чтения из входного файла. Вот что у меня есть. Я не уверен, какие аргументы я должен кормить execvp(). Здесь stringList [0] будет чем-то вроде строк «ls» или «cat». Если StringList [0] Ls файл будет содержать что-то вдоль линий логинсервера -a -lExec() читать из файла

int fd = open(iFile, O_RDONLY); 
dup2(fd, 0); 
close(fd); 

execvp(stringList[0], ...); 
cout << "Exec error!\n"; 
exit(1); 
+1

Вы проверили возвращаемые значения 'open' и' dup2'? Это может быть не просто «execvp». – Brian

+0

* Я пытаюсь получить exec() для чтения из входного файла. * Что вы ожидаете найти в файле и как вы хотите использовать содержимое файла? –

+0

Если stringList [0] был ls, тогда файл будет содержать что-то вдоль строк ls -a -l – Jess

ответ

0

Это звучит, как вы хотите, чтобы прочитать команду из файла, а затем выполнить эту команду. Если это ваша цель, вы должны фактически выполнить оболочку.

Ваш текущий подход open тогда dup2 не вызывает exec для чтения из файла, потому что exec никогда не читает со стандартного ввода. Он только считывает из исполняемого файла (для загрузки образа программы). Что ваш текущий подход делает redirect ввода, так что если 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.

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