Внедрить собственную оболочку

Я пытаюсь реализовать свою собственную оболочку. У меня есть несколько вопросов о моем коде и о задачах, которые необходимо решить. Ниже я излагаю свой предыдущий код и вопросы:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <string.h> #include <sys/wait.h> #include <sys/types.h> #include <ctype.h> #include <errno.h> #include <sys/stat.h> #include <fcntl.h> void parse(char *line, char **argv, char **argv2) { while (*line != '\0') { while (*line == ' ' || *line == '\t' || *line == '\n') { *line++ = '\0'; } if(*line == '>' && *(line+1) == '>') { while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n') { line++; } while (*line == ' ' || *line == '\t' || *line == '\n') { *line++ = '\0'; } *argv2 = line; break; } if(*line == '&') { break; } *argv++ = line; while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n') { line++; } } *argv = '\0'; } void execute(char **argv, int option) { pid_t pid; int status; if ((pid = fork()) < 0) { printf("*** ERROR ***\n"); exit(1); } else if (pid == 0) { if (execvp(*argv, argv) < 0) { printf("*** ERROR ***\n"); exit(1); } } else if(option == 1) { while (wait(&status) != pid); } } void execute2(char *command, char **argv, char **argv2) { pid_t pid; int status; if ((pid = fork()) < 0) { printf("*** ERROR ***\n"); exit(1); } else if (pid == 0) { //close(1); parse(command, argv, argv2); int output = open(*argv2, O_APPEND | O_WRONLY); dup2(output,1); if (strcmp(argv[0], "exit") == 0) exit(0); if (execvp(*argv, argv) < 0) { printf("*** ERROR ***\n"); exit(1); } close(output); } else { while (wait(&status) != pid); } } int specialChar(char *argv) { int i=0; while(argv[i]!='\0') { if(argv[i]=='>' && argv[i+1]=='>') return 1; else if(argv[i]=='&') return 2; else if(argv[i]=='|') return 3; i++; } } void main() { char command[20]; char *argv[64]; char *argv2[1]; char **history = (char**)malloc(20*sizeof(char*)); int counterHistory1=-1; int counterHistory2=0; int i; for(counterHistory2 = 0; counterHistory2<20; counterHistory2++) { history[counterHistory2]=(char*)malloc(100*sizeof(char)); } FILE *file; file=fopen("history", "w"); if(!file) printf("ERROR"); while (1) { printf("Shell -> "); gets(command); counterHistory1++; strcpy(history[counterHistory1],command); fopen("history", "w"); if(counterHistory1<20) for(i=0; i<=counterHistory1; i++) { fprintf(file,"%s\n",history[i]); } else for(i=counterHistory1-20; i<counterHistory1; i++) { fprintf(file,"%s\n",history[i]); } fflush(file); printf("\n"); switch(specialChar(command)) { case 1: //close(1); execute2(command,argv,argv2); break; case 2: //running program in background parse(command, argv, argv2); if (strcmp(argv[0], "exit") == 0) exit(0); execute(argv,0); break; case 3: break; default: parse(command, argv, argv2); if (strcmp(argv[0], "exit") == 0) exit(0); execute(argv,1); break; } fclose(file); } } 
  1. Когда последний знак, получаемый от пользователя, – «&», мне нужно запустить мою программу в фоновом режиме. Я читал, что могу это сделать, если не позвоню. Я сделал это хорошо, или я должен что-то изменить?
  2. В моей оболочке я должен создать трубы любой длины с | знак. Я не знаю, как решить эту проблему.

Interesting Posts

Использование команды tail для создания файла

Debian – сеть не работает при загрузке

Расписание по загрузочному постоянному обратному туннелю SSH на Mac OSX

Почему эти бомбы вилки-ракеты работают по-разному, и каково значение & в ней?

В чем разница между ULOG и NFLog?

Выполнить ту же команду несколько раз в фоновом режиме

Как я могу задать определенный сервер для загрузки

Перемещение по пробельному разделительному слову в bash / readline

Как подсчитать количество вхождений слова в текстовый файл с помощью командной строки?

Приложения медленны при первом открытии или после простоя на некоторое время

Всегда отображать энергетический апплет?

Какая самая маленькая операционная система только для командной строки?

Как добавить цвет фона с непрямоугольной формой в строку подсказки (PS1)?

альтернатива smbclient для больших файлов

скрипт для сканирования диапазона ip и возврата результатов в определенном формате

Linux и Unix - лучшая ОС в мире.