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
Problema fork... exec
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.
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.
- gioco
- Packager

- Messaggi: 900
- Iscritto il: dom 19 giu 2005, 0:00
- Slackware: last stable
- Località: in the court of the Wesnoth king
- Contatta:
Che exec*() usi?
Considera che:
Il ogni caso ti conviene controllare il valore di errno dopo la chiamata ad exec*().
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.- Blizzard
- 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:
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
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
- Blizzard
- 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:
SCUSATE!
mi dovevo controllare la errno nel cervello!!!
il codice per lanciare il comando era questo
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:
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
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);
}
}
} 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);
}
}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