|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 6
|
[c]uso combinato di fork ed execlp
Salve a tutti,
inanzitutto sono nuovo di questo forum e volevo farvi i complimenti vi seguo da un bel pò ma non avevo mai avuto occasione di registrartmi.. ..ora quest'occasione è arrivata.. ..sto sviluppando un piccolo programmino in c che se lanciato dalla shell di comando (es: ./nomeprogr stringa percorso) dovrebbe cercare la stringa "stringa" a partire da "percorso".Per far cio ho bisogno di creare un processo figlio con execlp che dovrebbe permettermi di invocare una shell per far eseguire una semplice find dove specificare cosa cercare e ridirigere l'output in un file di testo leggibile in un secondo momento dal processo padre.. allego il codice **************************************************************** #include "main.h"; int main(int argc,char *argv[]){ pid_t pid; FILE *fp; fp=fopen("/users/Al/cercastring/azzo.txt","w"); if((fp!=NULL)){ printf("File ridirezione creato\n"); if((pid=fork())==-1){ perror("Errore nella creazione processo figlio!!\n"); fclose(fp); return 2; } else{ printf("e fin qua ghe sen!!%d.\n",(int)getpid()); execlp("sh", "sh", "-c", "find &argv[2] -type d >> /users/Al/cercastring/azzo.txt", NULL); perror("Errore nella chiamata a execlp!\n"); fclose(fp); return 3; } fclose(fp); } else{ printf("Errore creazione file per la ridirezione!!\n"); } return 0; } Ora il mio problema sta nel fatto che non so come poter specificare argv[2] in quanto non viene preso il valore ma considerato come stringa.. ..qualcuno sa aiutarmi se mi sono spiegato bene.. Al |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Il tuo problema è che argv[2] è una stringa??? se è così allora lo risolvi in scioltezza dichiari una variabile intera e poi usi la funzione atoi() che vuole in ingresso una stringa e la "trasforma" in un intero... spero di aver capito la tua domanda...
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun Per i veri appassionati di Formula1: PassioneF1 |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 6
|
il mio problema è che argv[2] è una stringa perchè deve essere cosi è il percorso da dove iniziare a cercare..il problema sta nel fatto che la find non mi vede il valore di argv[2] e cioe il percorso ma me la vede come la stringa "argv[2]"
grazie al |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
invocando la fork stai creando un nuovo PCB.
Dovresti prima di chiamare la fork, copiarti qulle stringa in una variabile globale o usare un qualsiasi altro meccanismo di comunicazione interprocessi.
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 6
|
..scusa ma non sono ancora molto ferrato in materia programmazione in c come faccio a costruirmi la stringa da passare a execlp??.. grazie per il tuo tempo Al |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
il figlio creato con la fork dovrebbe avere una copia della memoria del processo padre quindi se crea una variabile di tipo puntatore a char e ci mette la sua stringa il processo figlio dovrebbe vederla senza problemi...
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun Per i veri appassionati di Formula1: PassioneF1 |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 6
|
si ma il problema è che in execlp("sh", "sh", "-c", "find argv[2] -type d >> /users/Al/cercastring/azzo.txt", NULL); argv[2] è preso come stringa e non come il valore che gli do io quando lancio il programma tipo ./nomeprogr asd /users/al/documents ad esempio dovrebbe metterci /users/al/documents e invece me lo considera come la stringa argv[2]
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Quote:
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun Per i veri appassionati di Formula1: PassioneF1 |
|
|
|
|
|
|
#9 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 6
|
esatto dovrei trovare un modo per poter passare il valore di argv[2] ad un comando shell..secondo te ce un modo per farlo??
Al |
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7261
|
Quote:
Quote:
http://en.wikipedia.org/wiki/String.h |
||
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 6
|
..bella idea ci ho provato ma purtroppo mi da errore..mi sa che non mi resta che concatenare la stringa..pero anche qui un piccolo problema..
..se faccio.. ****************** char *s="find"; strcat(s,argv[2]); printf("%s\n",s); mi restituisce l'errore "bus error".. dove sbaglio? AL |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Quote:
Aggiungi anche il controllo che ad esguire le nuove istruzioni sia il figlio ovvero dopo aver controllato il successo o meno della fork fa un altro controllo per vedere se il pid è uguale a 0 ,quindi se è il figlio, e gli fai eseguire la execlp poi prova a spatacare con le stringhe purtroppo non ho la possibilità di provarlo e non ho molta esperienza con la concatenazione di stringhe... cmq la tua ultima soluzione mi pare che in caso ti dovrebbe aprire una shell poi ti scrive la stringa e li si ferma non ti apre il file quindi non credo vada bene...
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun Per i veri appassionati di Formula1: PassioneF1 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:52.



















