Я пытаюсь выполнить команду UNIX через мою программу, которая будет обрабатывать до 4 аргументов, почему это либо приводит к ошибке seg, либо другим ошибкам?
using namespace std;
int main() {
char buffer[255];
cin >> buffer;
char* firstPtr;
char* secondPtr;
char* thirdPtr;
char* fourthPtr;
firstPtr = strtok(buffer, " ");
secondPtr = strtok(NULL, " ");
thirdPtr = strtok(NULL, " ");
fourthPtr = strtok(NULL, " ");
execlp(firstPtr, secondPtr);
return 0;
}
Крушение происходит из-за buffer
буфера.
Попробуйте использовать std::cin.getline(buffer, sizeof(buffer))
вместо std::cin >> buffer
Также обратите внимание, что strtok
может возвращать NULL
, поэтому убедитесь, что вы его обрабатываете.
./prog ab
.
Если вы проверите man-страницу execlp
, вы заметите, что первый аргумент (второй параметр для метода, параметр arg0
) является обязательным, в дополнение к любым другим параметрам вы можете перейти к функции через переменные параметры - и это также упоминается в тексте, что
Список аргументов должен быть прерван указателем NULL.
Первый аргумент (secondPtr в вашем случае) должен быть именем исполняемого файла; так что вы нарушаете соглашение, перейдя сюда в NULL (из-за cin >>
другие уже указали).
Но, кроме того, в конце вы также пропускаете по крайней мере еще один аргумент, который должен быть NULL
.
Поэтому рекомендуется изучать страницы руководства!
Я думаю, вы должны использовать
char buffer[255];
cin.getline(buffer, 255);
В противном случае ваш второй, третий и четвертый указатели будут пустыми.
cin >> buffer
разрывается на пробельных, так tokenizing это на" "
спорно. поэтомуsecondPtr
NULL, и вы счастливоsecondPtr
в UB-страну.