Я пытаюсь реализовать оболочку и в командной строке, когда пользователь вводит несколько команд, я хочу, чтобы эти команды были сохранены в
массив 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 и т. Д., О которых я упоминал выше.