Это действительно зависит от того, насколько простой должна быть ваша оболочка. Если вам не нужен контроль работы (т.е. фоновый режим) или конвейеры, тогда это очень просто. Вот пример:
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 1024
int main(int argc, char *argv[]) {
char line[MAX_LENGTH];
while (1) {
printf("$ ");
if (!fgets(line, MAX_LENGTH, stdin)) break;
system(line);
}
return 0;
}
Вы можете выйти из приведенного выше примера с помощью CTRL-D. Чтобы добавить встроенные команды, такие как exit или cd , вам необходимо токенизировать строку с помощью strtok () и посмотреть на первый токен. Вот более сложный пример с добавлением этих команд:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifdef _WIN32
#include <windows.h>
#define chdir _chdir
#else
#include <unistd.h>
#endif
#define MAX_LENGTH 1024
#define DELIMS " \t\r\n"
int main(int argc, char *argv[]) {
char *cmd;
char line[MAX_LENGTH];
while (1) {
printf("$ ");
if (!fgets(line, MAX_LENGTH, stdin)) break;
// Parse and execute command
if ((cmd = strtok(line, DELIMS))) {
// Clear errors
errno = 0;
if (strcmp(cmd, "cd") == 0) {
char *arg = strtok(0, DELIMS);
if (!arg) fprintf(stderr, "cd missing argument.\n");
else chdir(arg);
} else if (strcmp(cmd, "exit") == 0) {
break;
} else system(line);
if (errno) perror("Command failed");
}
}
return 0;
}
Вы можете расширить это, добавив больше встроенных команд или поддерживая такие вещи, как cd без аргументов для перехода в ваш домашний каталог. Вы также можете улучшить командную строку, добавив такую информацию, как текущий каталог.
В качестве примечания, простой способ добавить историю команд и функции редактирования строк - использовать библиотеку GNU readline .