Премини към съдържанието

Препоръчан отговор


Здравейте колеги, имам като задание да имплементирам "bash shell" ( език : С ), естествено, не в пълния си вид, а да може да изпълнява някои команди, като ( pwd, ls, echo, cat, rm, cd, etc. ). 
 

Седнах и направих план как да напиша програмата, и мисля че съм стигнал до някъде, баш шела работи, но странно защо, въведените команди веднъж се изпълняват веднъж не ( излиза съобщение : "command not found" ). 
Долу ще видите кода, моля за съвети как да процедирам. 

П.С. ще прикача снимка за да имате представа за какво говоря. 

 

 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include "functions.h"
#define SIZE 128

int main(int argc, char **argv)
{
    // call shell 
    shell_loop();

    return 0;
}

  

/**
 * gets user input 
 */
char *read_line(void)
{
    char *line = NULL;

    size_t len = 0;

    // save user's input in a character array 
    getline(&line, &len, stdin); 

    return line;
}

/**
 * splits user input into tokens 
 */
char **split(char *line)
{
    int pos = 0;
    char **tokens = malloc(SIZE * sizeof(char *));
    char *curr;

    curr = strtok(line, " "); 

    while (curr != NULL)
    {
        tokens[pos] = curr; // save current word into 'tokens'

        pos++; // update position 

        curr = strtok(NULL, " "); // get next word
    }

    return tokens;
}

/**
 * remove trailing '\n'
 */
void trim(char *s)
{
    int len = strlen(s); // get size of string

    // remove newline character
    if (s[len - 1] == '\n')
    {
        s[len - 1] = '\0';
    }
}

/**
 * gets local date and time in a specified format
 * and saves it into a character array 
 */
void *getLocalDateTime(char (*myTime)[SIZE])
{
    time_t t;

    struct tm *tmp;

    time(&t);

    tmp = localtime(&t); // get local date/time

    // saved it in passed char array 
    // by formatting it in a specific way 
    strftime(*myTime, sizeof(*myTime), "[%d/%m %H:%M]", tmp); 

    return 0;
}

  
  
  
  int execute(char **args){

    // if no command was entered 
    if(args[0] == NULL){
        return 1; 
    }

    // if "cd" is encountered
    else if(strcmp(args[0], "cd") == 0 ){
        return builtin_cd(args); 
    }

    // else use execvp()
    return launch_args(args); 
}
  
  
  
int launch_args(char **arguments)
{
    pid_t pid;
    int status;

  	// create a new process 
    pid = fork();

  	// if child = true 
    if (pid == 0)
    {	// execute command 
        if (execvp(arguments[0], arguments) == -1)
        {
            printf("shell: command not found: %s\n", arguments[0]);
        }
        exit(EXIT_FAILURE);
    }

    else if (pid < 0)
    {
        perror("forking failed");
    }
    //TODO:
    else
    {
        // parent process waits for child to complete
        wait(&status);
    }

    return 1;
}

int builtin_cd(char **args)
{

    if (args[1] == NULL)
    {
        // change directory to home directory 
        char *home = getenv("PATH");
        strcat(home, "/");
        chdir(home);
    }
    else
    {
        if (chdir(args[1]) != 0)
        {
            perror("shell: directory not found");
        }
    }

    return 1;
}



void shell_loop(void)
{
    char *line;
    char **arguments;
    int status;
    char myTime[SIZE];

    do
    {
        getLocalDateTime(&myTime); // get local date and time

        printf("%s # ", myTime); // print prompt

        line = read_line(); // get user input

        trim(line); // remove newline character

        arguments = split(line); // split input into tokens

        status = execute(arguments); // call appropriate function

        // cleanup
        free(line);
        free(arguments);
    } while (status);
}

                     
                     

 

Screen Shot 2019-03-14 at 8.50.14 PM.png

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.


  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Горещи теми в момента

  • Подобни теми

    • от FlippyBG
      Здравейте хора, кякой може ли да каже как да оправя програмата. Мерси предварително.
      Да се направи функция за копиране на дадена опашка C++ 
       
      #include <iostream>
      using namespace std;
      struct elem
      {
          int key; elem *next;
      };
      void push(elem * &first, elem * &last, elem * p, int n);
      int pop(elem * &first, elem * &last, elem * &p, int &n);
      void copyQueue(elem * first, elem * last, elem * p, elem * &first2, elem * &last2, elem * &p2, int num);
      int main()
      {
          int num;
          elem *first = NULL, *last = NULL, *p;
          elem *first2 = NULL, *last2 = NULL, *p2;

          cout << "\n ~~~ Enter a symbol to stop entering numbers ~~~\n";
          cout << "\n Enter numbers:  \n";
          while (cin >> num)
              push(first, last, p, num);
          cout << "\n The numbers are:  \n";
          //while (pop(first, last, p, num))
      //    {
      //        cout << num << " ";
      //    }

          copyQueue(first, last,p , first2, last2, p2, num);
          while (pop(first2, last2, p2, num))
          {
              cout << num << " ";
          }
          cout << "\n";
          while (pop(first, last, p, num))
          {
              cout << num << " ";
          }
      }
      void push(elem * &first, elem * &last, elem * &p, int n)
      {
          p = last;
          last = new elem;
          last->key = n;
          last->next = NULL;
          if (p != NULL) p->next = last;
          if (first == NULL)
          {
              first = last;
          }
      }
      int pop(elem * &first, elem * &last, elem * &p, int &n)
      {
          if (first)
          {
              n = first->key;
              p = first;
              first = first->next;
              if (first == NULL) last = first;
              delete p;
              return 1;
          }
          else
              system("pause");
          return 0;
      }
      void copyQueue(elem * first, elem * last, elem * p, elem * &first2, elem * &last2, elem * &p2, int num)
      {
          while (pop(first, last, p, num))
          {
              push(first2, last2, p2, num);
          }
      }
       
    • от Deqn Popov
      Да се напише програма на c++ , в която е дефиниран клас правоъгълник с член-променливи: страни на правоъгълника и член-функции: конструктор с два параметъра, функция за печат, функция, която изчислява като изходен параметър правоъгълник със страни, равна на сумата от страните на два правоъгълника, зададени като входни параметри. Да се състави главна функция, която създава обект от класа и демонстрира работата на член-функциите на класа.
    • от Plamy Gerova
      Може ли да помогнете с тази задаба: дадена е огърлица от черни и бели мъниста, така че няма две съседни черни мъниста. При зададени w-бели и b-черни мъниста да се отпечатат всички възможни огърлици.
    • от georgi999
      здравейте приятели може ли някой да ми каже как мога да създам десктоп приложение с джава и каква програма да си изтегля на която да се пише, и каква да бъде темата на приложението ,благодаря предварително 

    • от mitkow173
      Добър вечер, колеги! Трябва ми малко помощ с една задача на C++   
      Програма с функция main() и избор чрез меню на функции за: 
      • Въвеждане от клавиатура на размерност (с проверка за коректност) и елементи на масив от цели числа AM(K) (K <= 30); 
      • Изчисляване на средно-аритметичното от числата в масива, които се делят без остатък на 6; 
      • Изчисляване на сумата на различните от нула числа и броя на нулевите числа в масива; 
      • Намиране на максималното отрицателно число в масива и неговия пореден номер; 
      • Извеждане на екран на резултатите от съответното изчисляване, както и на въведените числа в масива (с подходящи текстове). 
       
      #include <iostream>
      using namespace std;
      const K = 30;
      double F[K];
      int N;
      void input();
      void average();
      void sum0();
      void menu();
          void main();
      {
              menu();
      }
          void input()
          {
              int i;
              do
              {
                  cout << "Vavedete razmernost na masiva ne poveche ot 30" << endl;
                  cin >> N;
              } while (N<1 || N>30);
              for (i = 0; i<N; N++);
              {
                  cout << "Vavedete element na masiv" << i + 1 << endl;
                  cin >> F;
              }
          }

          void average()
          {
              double sum;
              double m;
              int    i;
              int br = 0;
              for (int i = 0; i<N; i++)
                  m = F % 6;
              if (m == 0);
              sum += F;
              br++;
              cout << "Sredno aritmetichnoto na chislata v masiva koito se delqt bez ostatuk na 6" << sum / br << endl;
          }
          void sum0()
          {
              int i;
              int sum;
              int br = 0;
              for (i = 0; i<N; i++);
              if (F != 0)
                  sum += F;
              else
                  br++;
              cout << "Sumata na razlichnite chisla ot nula" << sum << endl;
              cout << "Broq na nulevite chisla v masiva e " << br << endl;
          }
          void maxn()
          {
              double min;
              int i;
              int n;
              for (i = 0; i<N; i++);
              if (F<0 && min>F);
              {
                  min = F;
                  n = i;
              }
              cout << "Maximalnoto otricatelno chislo v masiva e" << min << endl;
              cout << "Poredniqt mu nomer e" << n << endl;
          }
          void menu()
          {
              int izbor;
              do{
                  cout << "1.Vavejdane na razmernost na masiva i negovite stoinosti" << endl;
                  cout << "2.Izchislqvane na sredno aritmetichno ot chislata ,koito se delqt bez ostatuk na 5" << endl;
                  cout << "3.Izchislqvane na sumata na razlichnite ot nula chislq i broq na nulevite chisla" << endl;
                  cout << "4.Namirane na maksimalnoto polojitelno chislo i negoviqt poreden nomer" << endl;
                  cout << "5.Krai na programata" << endl;
                  cin >> izbor;
                  while ((izbor<1) || (izbor>5))
                      switch (izbor)
                  {
                      case 1:
                      { cout << "Vavejdane na chisla:" << endl;
                      input();
                      }break;
                      case 2:
                      {cout << "Sredno aritmetichno na chislata koito se delqt bez ostatuk na 5" << endl;
                      average();
                      }break;
                      case 3:
                      {cout << "Sumata na razlichnite ot nula chislq i broq na nulite:" << endl;
                      sum0();
                      }break;
                      case 4:
                      {cout << "Maksimalnoto polojitelno chislo i negoviq nomer" << endl;
                      maxn();
                      }break;
                      case 5:
                      {cout << "Krai na programata" << endl;
                      return;
                      }break;
                  }while (1);
              }
      Докарал съм я до някъде, но ми дава грешка и немога да я намеря 
      Благодаря предварително !!! 
       
  • Дарение

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване