Я пытаюсь сделать простую оболочку, но с определенным условием я должен использовать следующую структуру:
typedef struct cmd_struct{
char cmd[80];
char args[10][80];
int nargs;
} cmd_type;
Внутри cmd я сохраню основную команду и аргументы в args.
Затем я читаю из файла разные команды и сохраняю их в массив cmd_type. Моя программа или фейковая оболочка, запрашивает номер и должна брать его из этого массива.
Моя функция, которая выполняет команду, выглядит так:
void execCmd(cmd_type* cmds_arg, int idxCmd){
pid_t pid;
printf("Father: my pid is %d\n", getpid());
char* buff;
pid = fork();
if (pid == 0) {
printf("Child process: My pid is %d\n", getpid());
printf("-------------- Child doing exec: %s\n", cmds_arg[idxCmd].cmd);
execvp(cmds_arg[idxCmd].cmd,&cmds_arg[idxCmd].args);
_exit(2);
_exit(1);
}
printf("Father: Gonna wait for Child\n");
int status;
wait(&status);
printf("-------------- Father: Child finished\n");
// WIFEXITED, WEXITSTATUS Macro of the gnu lib POSIX standard to recover end status
if ( WIFEXITED(status) ) {
const int es = WEXITSTATUS(status);
printf("Father: Child Complete with exit status %d\n", es);
if(es == 1) printf("Father: Child didn't execute any command\n");
else if(es == 2) printf("Father: Child command was not found\n");
}
}
Как видите, когда я вызываю системный вызов execvp(), я делаю это неправильно. Первый аргумент я считаю правильным, второй совершенно неверным.
Во-первых, у меня тут проблема с преобразованием, а вторая проблема в том, что массив должен содержать основную команду, arg1, arg2... а у меня только аргументы. Я ошибаюсь?
Есть ли способ добавить основную команду с помощью таких сервисов, как sscanf()? И самое главное, есть ли у меня шанс заставить это работать таким образом?