команда выхода в оболочке - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь написать оболочку на языке Си.Я пытаюсь реализовать команду выхода, но у меня возникают проблемы с получением оболочки для выполнения команд перед выходом.

Пользователь может ввести:

> quit 
> quit; cat file 
> cat file; quit

Оболочке необходимо выполнить файл catКоманда в обеих строках перед выходом.

Это то, что у меня есть в данный момент, но оно не завершает команды перед выходом.

if(strstr(argument[0], "exit"))
{
    if(strcmp(argument[0],"exit")==0)
    {
        exit(0);
    }
    int i=0;
    while(argument[i] != '\0')
    {
        strcpy(&command[i], argument[i]);
        if(strcmp(command, "exit")==0){i++;}
        printf("Argument[i] = %s \n", command);
        execvp(command, argument);
        i++;
    }
    exit(0);
}

1 Ответ

2 голосов
/ 09 апреля 2019

Вам необходим механизм fork-exec для этого.
Семейство функций exec заменит текущий образ процесса новым образом процесса . Поэтому, когда вы выполняете программу, вы теряете контроль над вызывающей программой. Если вы хотите вернуться, вы должны fork ребенок, в котором вы можете позвонить execv и заставить своих родителей ждать, пока ребенок не прекратит свое существование.

Вот небольшой фрагмент, иллюстрирующий fork-exec

int pid = my_fork();
if(pid == -1){
  printf("failed\n"); // We failed - bail out. 
}
else if(pid > 0){ // let the parent wait
 int status;
 waitpid(pid, &status, 0);
}
else{ // child
  execvp(command,argument); 
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...