Problema fork... exec

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Problema fork... exec

Messaggio 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

Avatar utente
gioco
Packager
Packager
Messaggi: 900
Iscritto il: dom 19 giu 2005, 0:00
Slackware: last stable
Località: in the court of the Wesnoth king
Contatta:

Messaggio 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*().

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio 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

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Messaggio 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

Rispondi