Pagina 1 di 1

Problema fork... exec

Inviato: ven 14 set 2007, 15:46
da Blizzard
Ciao ragazzi,

stavo scrivendo una piccola shell che spero quanto prima di rilasciare (ho scelto la GPLv3 per farlo).
Tuttavia ho un piccolo problema.
Per lanciare un programma utilizzo la storica accoppiata fork()...exec*().
Il problema è che riesco a lanciare solo alcuni dei comandi. Altri, del tipo di su... jed... kwrite ecc... non riesco a lanciarli.
All'inizio credevo si trattasse del fatto che alcuni programmi sfruttino KDE e altri comunque prevedano l'interazione dell'utente.
Tuttavia software tipo vim e alcuni che ho scritto io funzionano alla grande!!
Quando lancio un programma tipo su non accade niente... ne un errore ne altre cose strane. Semplicemente ritorna al prompt.

Per voi da cosa dipende il problema??? (Dovrei assumere che l'implementazione è corretta perchè fa quello che deve e in più lancia quasi tutti i programmi)

grazie
Gio

P.S.
Se arrivo a concluderla sta shell, c'è qualcuno disposto ad aiutarmi con la documentazione??? Non so un'H di come si scrive una pagina di man o di come la si installa e il programma è di progetto abbastanza grande da permettermi di dedicarci troppo tempo

Inviato: ven 14 set 2007, 15:57
da gioco
Che exec*() usi?
Considera che:

Codice: Seleziona tutto

The  functions  execlp() and execvp() will duplicate the actions of the
       shell in searching for an executable file  if  the  specified  filename
       does  not  contain  a slash (/) character.  The search path is the path
       specified in the environment by the PATH variable.   If  this  variable
       isn't specified, the default path ``:/bin:/usr/bin'' is used.  In addi-
       tion, certain errors are treated specially.
Il ogni caso ti conviene controllare il valore di errno dopo la chiamata ad exec*().

Inviato: ven 14 set 2007, 16:03
da Blizzard
allora!

utilizzo execv ed execvp.
Nel caso dei (programmi)comandi utilizzo la execvp così se li va a cercare lui.

Il problema è che controllo il valore di uscita della execvp e non è <0
Quindi non posso controllare errno perchè la system call è stata eseguita e pure con successo.
Di fatti se gli passo ls o dmesg o un qualsiasi programma di mio pugno lo esegue...

ciao
Gio

Inviato: ven 14 set 2007, 16:10
da Blizzard
SCUSATE!

mi dovevo controllare la errno nel cervello!!!
il codice per lanciare il comando era questo

Codice: Seleziona tutto

if(pr->result==COMMAND)
		{
			strcpy(command,pr->argv[0]);
			
			if(pr->argc>1)
			{
				if((execvp(command,pr->argv))<0)
				{
					fprintf(stderr,"Can't execute command\n");
					fprintf(stderr,"Implementation in ExecuteFGSingleProcess in [laucher.c]\n");
					exit(EXIT_FAILURE);	
				}
			}
			else
			{
				if((execvp(command,NULL))<0)
				{
					fprintf(stderr,"Can't execute command\n");
					fprintf(stderr,"Implementation in ExecuteFGSingleProcess in [laucher.c]\n");	
					exit(EXIT_FAILURE);
				}
			}
		} 
Se vedete il secondo execvp noterete che passo NULL agli argomenti!
Baka! devo comunque passare l'argomento che è il nome del comando!
Così il nuovo codice corretto e funzionante diventa:

Codice: Seleziona tutto

if(pr->result==COMMAND)
		{
			strcpy(command,pr->argv[0]);
			
			if((execvp(command,pr->argv))<0)
			{
				fprintf(stderr,"Can't execute command\n");
				fprintf(stderr,"Implementation in ExecuteFGSingleProcess in [laucher.c]\n");
				exit(EXIT_FAILURE);	
			}
		}
Che è la metà e che soprattutto funziona!
Mi scuso ma sono solito a questi errori! poi ci si mettono pure un gruppo di programmi separatisti che funzionano nonostante le mie cavolate e allora perdo tempo in debugging e cavoli vari :P

COMUNQUE LA RICHIESTA DI AIUTO CIRCA LA REDAZIONE DELLA DOCUMENTAZIONE RIMANE VALIDA.
Se qualcuno è disponibile appena rilascio la prima shell su SF gli do tutti i dettagli circa l'utilizzo

ciao
Gio