Мне нужно написать код для следующей опции «--command».Многопроцессорность языка C execvp()
execvp() терпит неудачу, когда я бегу:
./program --command 1 2 3 кошки test.txt
--command МОР CMD арг Выполнение команды со стандартным параметром я, стандартный выход o и стандартная ошибка e; эти значения должны соответствовать более ранним параметрам файла или трубы. Исполняемый файл для команды - cmd и имеет аргументы аргументов 0 или более аргументов. Ни один из операндов cmd и args не начинается с двух символов «-».
Часть кода, который должен сделать execvp() выглядит следующим образом:
if(optarg){
int fd;
int i = 0;
char *arg[20];
int index;
for(index = optind-1; index < argc && *argv[index] != '-'; index++, i++){
switch(i){
case 0:
fd = atoi(argv[index]);
break;
case 1:
fd = atoi(argv[index]);
break;
case 2:
fd = atoi(argv[index]);
break;
default:
arg[i - 3] = (char *)malloc(100 * sizeof(char));
strcpy(arg[i - 3], argv[index]);
}
}
int j;
for(j = 0; j < i - 3; j++)
printf("%s\t", arg[j]);
printf("\n\n");
execvp(*arg, arg);
}
Любая помощь высоко ценится.
0 Вы не упомянули, что характер неудачи, что затрудняет вам помощь. Использование '1 2 3' для in, out и err очень странно (stdin - fd 0, а не 1), но поскольку вы, похоже, ничего не делаете с аргументами tjod, я не думаю, что это связано. Копирование строк, а не просто предоставление правильного смещения в массив args неэффективно и сложно, но я должен работать, если вы правильно завершаете нуль. Если вы настаиваете на копировании строк, используйте strlen для определения необходимого размера (или просто вызовите strdup, а не malloc + strcpy). – rici
Спасибо, я использую strdup() сейчас. Проблема заключается в размере массива. так как в моем тесте я пропускаю только два argumeny cat test.txt, поэтому char ** arg должен иметь только две строки, тогда как я объявил 20 (char * arg [20]). Как я могу динамически добавлять размер char ** arg. Я не знаю, сколько аргументов пройдет, поэтому я взял номер болота, но execvp() не удалось из-за мусора в моем большом массиве. – user3050866
Создайте MCVE ([MCVE]) - он не должен быть намного больше, чем вы показываете, но ему нужно воспроизвести вашу проблему, и нам нужно уметь ее компилировать и запускать (и видеть проблему). –