• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przekazanie komendy od użytkownika do execvp w języku C

0 głosów
283 wizyt
pytanie zadane 17 listopada 2015 w C i C++ przez RegularLemon Stary wyjadacz (12,240 p.)

Witajcie, w języku C jestem laikiem, więc w kodzie mogą pojawić się dziwne rzeczy.
Mam pytanie dla was, starych wyjadaczy C :p

Pobieram za pomocą fgets input od użytkownika zawierający komendę Basha i zapisuję go do tablicy o nazwie string.  Wewnątrz podanej przez użtykownika komendy mogą być spacje przed flagami, np "ls -la", więc w pętli for wypisuje kolejne flagi polecenia do tablicy dwuwymiarowej. Polecenie i każda kolejna flaga do kolejnych wierszy tablicy.

W kolejnej pętli for zapisuje strigi z tablicy dwuwymiarowej vector do tablicy jednowymiarowej pass, którą przekażę do execvp jak drugi argument.

Problem w tym, że funkcja execvp nie działa i nie wykonuje komend, mimo że tablica pass zawiera jako kolejne elementy tablicy stringi zawierające polecenie i flagi.

Gdzie leży problem? Powinienem wywołać jakośc execvp w innym procesie za pomocą forka, bo inaczej nie zadziała? Źle przekazuję argumenty?

Z góry dzięki za całą waszą pomoc, poniżej zamieszczam kod.
BTW. kod jest częścią więszego programu. Muszę użyc execvp a nie np execlp. Sensowną alokacją pamięci dla tablic też chcę zając się później, na razie najlepiej żeby to wogóle zadziałało :)

#include <stdio.h>
#include <string.h>

int iloscFlag=0,i,len,j=0,k=0;
char string[30], vector[32][32];
char* pass[32];

int main(int argc, char* argv[]) {

	
	printf("\n>>");
	fgets(string,30,stdin);
	len = strlen(string);
	
	//Wyciaganie komendy z inputa do vectora
	for ( i=0; i<len; i++) {
		if ( string[i] != ' ' ) {
			vector[j][k] = string[i];
			k++;
		} else {
			vector[j][k] = '\0'; 
			j++;
			iloscFlag++;
			k=0;
		}
	}	
	
	//Tworzenie tablicy wskaznikow na kolejne tablice stringow.
	for ( i=0; i<=iloscFlag; i++ ) {
		pass[i] = vector[i];
	}

	execvp(argv[0],pass);

	return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 17 listopada 2015 przez furas Maniak (53,680 p.)
wybrane 17 listopada 2015 przez RegularLemon
 
Najlepsza

U mnie częściowo działa - program wywołuje sam siebie (bo podany jest argv[0] w execvp) i pojawia się ponownie znak zachęty ">>". Skompilowałem do pliku `main` i jak po ">>" podam `./main dowolny_argument` to uruchamia się ponownie i może tak w nieskończoność. Ale jak podam samo `./main` to już się gdzieś wywala.

---

W sumie powinieneś wywoływać

execvp(polecenie, argumenty);

a wywołujesz

execvp(argv[0], polecenie+argumenty);

choć nie jest pewny czy zwykle nie wywołuje się 

execvp(polecenie, polecenie+argumenty+NULL);

komentarz 17 listopada 2015 przez RegularLemon Stary wyjadacz (12,240 p.)
edycja 18 listopada 2015 przez RegularLemon

Wielkie dzięki za pomoc. Poprawiłem trochę kod i wygląda na to, że teraz działa. Poniżej zamieszczam kod dla potomnych :)

Wypisałem poprawki w komentarzach.

#include <stdio.h>
#include <string.h>
 
int iloscFlag=0,i,len,j=0,k=0;
char string[30], vector[32][32];
char* pass[32];
 
int main(int argc, char* argv[]) {
 
      
    printf("\n>>");
    fgets(string,30,stdin);
    len = strlen(string);
      
    //Wyciaganie komendy z inputa do vectora
    for ( i=0; i<len; i++) {
        if ( string[i] == ' ' ) {
            vector[j][k] = '\0';  
            j++;
            iloscFlag++;
            k=0;
    //Wymagane w przypadku wprowadzenia tylko komendy, bez flag.
    } else if ( string[i] == '\n' ) {
        iloscFlag++;
    } else {
        vector[j][k] = string[i];
        k++;  
    }
 
    }    
    //Tworzenie tablicy wskaznikow na kolejne wiersze vectora.
    for ( i=0; i<iloscFlag; i++ ) {
        pass[i] = vector[i];
    }
 
    execvp(vector[0],pass);
 
    return 0;
}

 

Podobne pytania

0 głosów
3 odpowiedzi 269 wizyt
pytanie zadane 8 listopada 2019 w C i C++ przez Mała Mi Początkujący (270 p.)
0 głosów
1 odpowiedź 600 wizyt
0 głosów
0 odpowiedzi 147 wizyt
pytanie zadane 23 czerwca 2019 w C i C++ przez wieczor9 Początkujący (370 p.)

88,686 zapytań

137,299 odpowiedzi

306,685 komentarzy

58,876 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...