Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [c] problema con strcat

    http://pastebin.com/d3e6a3d82

    Non riesco a capire dove sia l'errore. Intorno alla riga 46 dove c'è la strcat dovrebbe esserci l'errore.
    Il punto è che con una execv devo passare tutto il path completo del comando come /bin/ls e non solo ls.
    Qualcuno ha qualche idea ?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non ho letto in dettaglio e non ho ben capito cosa intendi fare, comunque questo

    codice:
    char* path[] = { "/bin/", (char*) 0 };
    strcat(*path, *a);
    non lo puoi fare perché per concatenare qualcosa ad una stringa, devi allocare per questa spazio a sufficienza. Dichiarando *path in quel modo tu stai allocando uno spazio statico di 6 byte (5 per "/bin/" più il terminatore) quindi non potrai aggiungere altri caratteri con strcat(). Potresti metterci una pezza così:

    codice:
    char command[10] = "/bin/";
    char* path[2];
    path[0] = command;
    path[1] = (char *) 0;
    strcat(*path, *a);
    che è una soluzione un po' brutta ma risulta difficile trovarne di migliori senza mettere una mano pesante al codice, che per ora non ho letto e compreso del tutto.

    PS: hai valutato la possibilità di usare altre funzioni anziché execv()? Tipo execpl()...
    every day above ground is a good one

  3. #3
    ho pensato di modificare come segue

    codice:
    char* path[100]; 					
    char* a[] = { argv[now] }; 					
    *path = "/bin/"; 					
    printf("STRINGA PARTENZA: %s\n", *path); 					
    strcat(*path, *a); 					
    printf("STRINGA OTTENUTA : %s\n", *path); 					
    if(execv(*path, a ) == -1) { 						
    printf("Error Occured on execv; Quitting...\n"); 						
    return(-4); 					
    }

    Per evitare la memorizzazione statica, ma non và ugualmente. Idee ?

    P.s. è un esercizio e devo usare per forza quella funzione

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non cambia nulla in quel modo, stai dichiarando un array di 100 puntatori a carattere e poi inizializzi staticamente il primo di essi scrivendo

    codice:
    *path = "/bin/";
    Puoi ricorrere all'allocazione dinamica

    codice:
    	printf("E' nato un figlio...\n");
    	printf("SONO UN FIGLIO ED ESEGUO IL COMANDO : %s\n", argv[now]);
    	char *path;
    	char *a[] = { argv[now], (char *) 0 };
    	path = (char *) malloc(5 + strlen(argv[now]) + 1);
    	strncpy(path, "/bin/", 5);
    	printf("STRINGA PARTENZA: %s\n", path);
    	strncat(path, *a, strlen(*a));
    	printf("STRINGA OTTENUTA : %s\n", path);
    	printf("STRINGA OTTENUTA : %s\n", path);
    	if(execv(path, a ) == -1) {
    		printf("Error Occured on execv; Quitting...\n");
    		return(-4);
    	}
    	return(1);
    includendo ovviamente l'header file stdlib.h. Ho introdotto le versioni "safe" di strcpy() e strcat().

    Comunque il return(1) dopo la execv() è inutile: se la funzione viene eseguita con successo, l'immagine del processo corrente in memoria viene sostituita con un'altra per eseguire il comando "path", e tutte le eventuali istruzioni successive ovviamente non saranno eseguite in quanto il text segment sarà completamente sostituito.
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.