2014-12-15 7 views
4

Я хочу написать программу, которая действует как оболочка Linux. Я начал писать небольшую программу для выполнения команды «ls». Я не могу понять, как я должен действовать, чтобы моя программа отвечала на любую команду, как это делает оболочка. (например, cat, cd, dir).Выполнение команд оболочки с помощью execvp()

#include <iostream> 
#include <unistd.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#define MAX 32 
using namespace std; 

int main() { 
    pid_t c; 
    char s[MAX]; 
    int fd[2]; 
    int n; 

    pipe(fd); 
    c = fork(); 

    if(c == 0) { 
     close(fd[0]); 
     dup2(fd[1], 1); 
     execlp("ls", "ls", "-l", NULL); 
     return 0; 
    } else { 
     close(fd[1]); 
     while((n = read(fd[0], s, MAX-1)) > 0) { 
      s[n] = '\0'; 
      cout<<s; 
     } 
     close(fd[0]); 
     return 0; 
    } 

    return 0; 
} 

Как я могу сделать свою программу чтения, какие типы пользователей в и передает его execlp (или нечто подобное, что делает то же самое)?

+0

_ "... чтобы сделать мою программу реагировать на любую команду ..." _ В родительском процессе у Вас есть 'Fd [1]' дескриптор файла, этот вы можете использовать, чтобы написать что-то на установленном 'pipe()'. Обратите внимание, что команды, которые вы указали, не требуют никакого взаимодействия со входа. –

ответ

3

Оболочка в основном выполняет следующие действия:

  1. читает строку из стандартного ввода
  2. разбирает эту строку, чтобы составить список слов
  3. вилки
  4. затем оболочка (родительский процесс) ждет, пока конец дочернего элемента, в то время как дочерний элемент exec выполняет код команды, представленной списком слов, извлеченных из строки ввода.
  5. оболочка затем перезапускает на шаге 1.

Construct первого очень простая оболочка.

1

Если я правильно понимаю проблему, вы можете:

  • чтения массив строк с scanf()
  • запустить его в качестве команды с execvp() (он работает так же, как execlp(), но Вы можете передать все аргументы как массив).

Что-то вроде:

char args[100][50]; 
int nargs = 0; 
while(scanf(" %s ", args[nargs])) 
    nargs++; 
args[nargs] = NULL; 
/* fork here * 
... 
/* child process */ 
execvp(args[0], args); 
Смежные вопросы