C входной цикл для оболочки - PullRequest
0 голосов
/ 08 января 2011

Итак, я работаю над созданием очень простой программы на C, которая просто выполняет команды оболочки. Это то, что я до сих пор:

#include <stdio.h>
int main()
{
char input[30];
fputs("$ ", stdout);
fflush(stdout);
fgets(input, sizeof input, stdin);
system(input);
}

Работает, но только для одной команды. Например, если я скомпилирую и наберу ./cmd, я получу приглашение $. Если я наберу ls, я получу то, что должен. Но затем он выходит и возвращается к обычной системной оболочке. Как я могу сделать так, чтобы после того, как пользователь набрал команду, он возвращается к вводу «$».

Ответы [ 3 ]

0 голосов
/ 08 января 2011

То, что вы ищете, это петли ; если вы хотите, чтобы условие выхода определялось пользовательским вводом, на самом деле вам, вероятно, потребуется бесконечный цикл (идиоматический способ - for(;;)) и if после получения ввода, что приводит к break, если состояние удовлетворено.

#include <stdio.h>

int main()
{
    char input[30];
    for(;;) /* infinite loop */
    {
        fputs("$ ", stdout);
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        if(/* put here your exit condition */)
            break; /* breaks out of the loop */
        system(input);
    }
    return 0;
}

Ваше условие выхода, вероятно, будет включать использование strcmp (из <string.h>) для сравнения строки, введенной пользователем, и вашей команды выхода.

0 голосов
/ 08 января 2011

Вам не нужен какой-либо цикл, вам нужен цикл do while, потому что вы всегда хотите выполнить команду system() хотя бы один раз.Кроме того, если ключевое слово exit является вашим условием прерывания, нет необходимости в дополнительном коде для проверки input перед вызовом system(), поскольку exit убьет и вашу оболочку, и вашу программу, если вы используете strcmp()как условный оператор do-while.

#include <stdio.h>
#include <string.h>

int main(void)
{
  char input[30];
  do {
    fputs("$ ", stdout);
    fflush(stdout);
    fgets(input, sizeof input, stdin);
    system(input);
  } while(strcmp(input,"exit\n"));

  return 0;
}

Вывод

[siegex@localhost]$ ./myshell
$ echo foo
foo
$ echo bar | sed 's/r/z/'
baz
$ exit
[siegex@localhost]$
0 голосов
/ 08 января 2011

Вы должны поместить свой код в цикл. Например:

int main()
{
    while (1) {
        char input[30];
        fputs("$ ", stdout);    
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        system(input);
    }
}

while (1) { ... } - это бесконечный цикл. Единственный выход - это каким-то образом убить вашу программу. Чтобы выйти из цикла с помощью команды, вам нужно поместить в нее какое-то условие:

    while (1) {
        char input[30];
        fputs("$ ", stdout);    
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        if (strcmp(input, "exit") == 0) {
            break;
        }
        system(input);
    }

strcmp() делает сравнение, чтобы увидеть, если вы ввели "выход". Если это так, то оператор break выходит из ближайшего цикла, и ваша программа завершается.

...