ошибка в использовании указателей для хранения аргументов командной строки в argv1 - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь реализовать оболочку и в командной строке, когда пользователь вводит несколько команд, я хочу, чтобы эти команды были сохранены в массив argv1 как следующий

argv1[0]="ls -al"  
argv1[1]=command 2 with arguments  
argv1[2]=command 3 with arguments

то, что я написал, следующее

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_LEN 1024

int main()
{
        char line[BUFFER_LEN];  //get command line
        char *argv[100];        //user command
        char **argv1[10];       //user command
        int n = 0;
        int argc;
        fgets(line, BUFFER_LEN, stdin);
        char *token;            //split command into separate strings
        token = strtok(line, " ");
        int i = 0;
        while (token != NULL) {
                argv[i] = token;
                token = strtok(NULL, " ");
                i++;
        }
        argv[i] = NULL;         //set last value to NULL for execvp
        argv1[n] = argv;        //we are storing commands in format argv1={"ls -al","wc","tee"}
        n++;                    //for argv1 tracking
        printf("value in argv1 is %s\n", argv[n - 1]);
        argc = i;               //get arg count
        for (i = 0; i < argc; i++) {
                printf("%s\n", argv[i]);        //print command/args
        }

}

Я хочу, чтобы эта полная команда с аргументами шла в argv1 [0], как это сделать
этот. Это то, о чем я не могу думать.

Я хочу сделать что-то в этом роде

int
main(int argc, char *argv[])
{
        char *ls[] = {"ls", "-al", NULL};
        char *rev[] = {"rev", NULL};
        char *nl[] = {"nl", NULL};
        char *cat[] = {"cat", "-e", NULL};
        char **cmd[] = {ls, rev, nl, cat, NULL};

        pipeline(cmd);
        return (0);
}
~

Внутри функции конвейера я буду передавать команды одну за другой, которые будут выполняться в цикле while с несколькими открытыми каналами и дескрипторами файлов. Они заменят выходные данные в вызовах execlp из stdout в каналы в цикле while, Команды в исходном коде приходят в argv [0] = ls, argv [1] = - al, где как я хочу реализовать
some_pointer = ARGV [0] + ARGV [1]
здесь некоторый указатель - команда, которую я передам в конвейере основной функции то есть конвейер (somepointer), остальной код будет выполняться по полной команде, переданной с аргументами в функции pipleine, это то, чего я хочу добиться, и реализовать то, чего я не могу понять. В реальной реализации я буду принимать ввод через fgets от пользователя, а не как массивы символов * ls, * nl и т. Д., О которых я упоминал выше.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вы захотите использовать argv и argc. Вот кое-что, что я быстро сделал на основе вашей попытки.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_LEN 256

int main(int argc, char *argv[])
{
  /* Command and arguments */
  char *cmd = NULL;
  char args[argc][BUFFER_LEN] ;

  /* Print command */
  printf("Command was: %s. ", argv[1]);

  /* Return early if no arguments */
  if(argc == 2) return 1;

  /* Copy arguments */
  for(int i=2; i<argc; i++)
  {
    strncpy(args[i], argv[i], sizeof(argv[i]));
  }

  /* Print args */
  for(int j=2; j<argc; j++)
  {
    printf("Arg %d is %s ", j, argv[j]);
  }

  return 0;
}

Пример:

$ ./test ls
Command was: ls.

$ ./test ls -al
Command was: ls. Arg 2 is -al
0 голосов
/ 28 августа 2018

Он не хочет получить argv в основном, но читает входные данные после эмуляции оболочки.

Проверьте функцию getopt, которая может вам помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...