Създавам малка обвивка, за да разбера по-добре C. Използвам функцията getline на POSIX, за да получа низ и да го разделя на токени чрез интервала. Но когато се обаждам на execvp(), за да направя системното извикване, нищо не се случва.. Ако някой ми посочи къде е проблемът, който имам, очевидно пропускам нещо вероятно малко.. (Не съм включил целия код така че някои фигурни скоби ще липсват в долната част, просто игнорирайте това, съжалявам) Много благодаря
char *args[3]; // array for the command and arguments
cmd = strtok(line, " ");
args[0] = cmd; // put the first command in the array
for(int i = 1; i < whitespace+1; ++i){
cmd = strtok('\0', " \n");
args[i] = cmd; // fill the array of strings with the arguments
}
args[2] = '\0'; // assign last element to NULL
pid = fork();
if(pid != 0){
waitpid(-1, &stat, 0);
}
else{
char *const *test[1];
test[0] = '\0';
execvp("/bin/ls", test[0]);
execvp(args[0], &args[1]);
Точно в края е мястото, където имам проблеми, опитах и двете версии на execvp поотделно, но нито една не работи и бях заседнал по този проблем от 2 дни.. Оценявам всякаква помощ, благодаря
args[2] = '\0';
е неортодоксален (но законен) начин за задаване на нулев указател. Той също така ограничава вашата команда до най-много едно име на файл. Цикълът преди да стане малко излишен. След това имате двеexecvp()
повиквания; ако първият успее, вторият няма да бъде изпълнен. Правилният начин за извикване наexecvp()
еexecvp(args[0], args);
. Трябва да имате код за съобщаване на грешка следexecvp()
-- ако се върне, значи е неуспешен -- и обикновено трябва да излезе. - person Jonathan Leffler   schedule 13.11.2014getline()
е разширение на GNU, което не е определено от POSIX. Имам само думите ви, че го използвате, тъй като не се появява в кода, който представихте. - person John Bollinger   schedule 13.11.2014execvp()
работи, той не се връща, така че рядко е подходящо да го извиквате два пъти подред. Ако се върне, тогава е възникнала грешка и можете да разберете естеството на тази грешка чрез променливатаerrno
, може би чрез функциятаperror()
. - person John Bollinger   schedule 13.11.2014args[2] = NULL;
АкоNULL
не е дефинирано, включете<stddef.h>
- person Paul Roub   schedule 13.11.2014