Опитвам се да направя проста обвивка, но със специфично условие, трябва да използвам следната структура:
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 ()? И най-важното, имам ли някакъв шанс да го накарам да работи по този начин?