Циклы перенаправления файлов в пользовательской оболочке c - PullRequest
0 голосов
/ 04 декабря 2018

Попытка создать пользовательскую оболочку в c, которая выполняет (среди прочего) эту команду

  • ls -l >> text.txt

Теперь это работало,но после изменений в getArgs () он либо бесконечно печатает сообщения об успешном завершении без создания файла, либо ненормально завершается.

Вот соответствующий код

else if(option == 3){
        directory=" ";
        if(A[0]=='.' || A[0]=='/'){
          directory="./";
        }
        getArgs(&A,args,directory,&size);
        for(i=0;i<size;i++){
          printf("arg[%d] : %s\n",i,args[i]);
        }
        directory=concat(directory,args[0]);
        printf("directory %s\n",directory );
        fp = open(args[3],O_RDWR | O_CREAT|O_TRUNC,S_IRWXU);

        pid=fork();

        if(pid==0){
            com = args[0];
            dup2(fp,STDOUT_FILENO);
            readCommand(args,directory,com,0);
            return 1;
        }

        waitpid(-1,&status,0);
        dup2(output,STDOUT_FILENO);

        if(WIFEXITED(status)){
            printf("Data successfully saved in file");
        }else{
            printf("Abnormal termination\n");
        }

        close(fp);
        close(output);
        clean(args);
    }

Вот mylib.cфайл, включающий getArgs ()

    #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include "mylib.h"


#define MAX_SIZE 50

void getArgs(char **A,char *args[10], char *directory,int *sizeA){

    int i,j,num,slash,size;
    char *token,*s,*dummy;

    trim(*A,&size);

    *A=(char*)realloc(*A,(size) * sizeof(char*));

    token = strtok (*A, " ");
    num=0;

    while (token != NULL)
    {
        args[num] = token;
        token = strtok (NULL, " ");
        num++;
    }
    s=args[0];
    for(i=num;i<10;i++){
        args[i]="\0";
    }

    if(*A[0]=='.' || *A[0]=='/'){
        for(i=0;*args[i]!='\0';i++){
            if(args[0][i]=='/'){
                slash=i;
            }
        }
        slash+=1;
        j=0;
        if(*A[0]=='.'){
          memmove(args[0], (args[0])+slash, strlen(args[0]));
        }
        else if(*A[0]=='/'){
          memmove(args[0], (args[0])+slash, strlen(args[0]));
        }
    }
    *sizeA=num;
  }


  //resets args array
  void clean(char *args[10]){
      int i;
      for(i=0;i<10;i++){
          args[i] = '\0';
      }
  }


  //reads  and executes command
  void readCommand(char *args[10],char *directory,char *com, int i){

    if(execl(directory, args[i],args[i+1], NULL)==-1){
        execl("/bin/sh", "/bin/sh", "-c", com, NULL);
        perror("execlp");
    }
    else{
        execl(directory, args[0],args[1],args[2],args[3],args[4], NULL); //max number of args=4
        perror("execlp");
    }
  }


  //concatenates 2 strings
  char* concat(const char *s1, const char *s2)
  {
      const size_t len1 = strlen(s1);
      const size_t len2 = strlen(s2);
      char *result = malloc(len1 + len2 + 1);
      memcpy(result, s1, len1);
      memcpy(result + len1, s2, len2 + 1);
      return result;
  }


  //trims the /n from the arguement
  void trim(char *A,int *size){
    int i=0;
    do{
        *size=i;
        if(A[i]=='\n'){
          A[i]='\0';
        }
        i++;
      }while(A[i]!='\n');
  }
...