Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-12-2006, 19:55   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
[C] Alcuni problemi riguardo la exec()

Ciao.

Sto creando una piccola shell in C. Ho alcuni problemi:

1 - Eseguendo la execvp ad esempio con ls, ho l'output di ls normalmente; se invece aggiungo un argomento ad esempio per eseguire ls -l non mi fa vedere l'output come dovrebbe essere con l'opzione -l ma me lo fa vedere come se non ci fosse tale opzione. E' come se ignorasse gli argomenti, non capisco perché.

2 - Nella gestione del segnale (fatta da me) di SIGQUIT quando premo la combinazione di tasti CTRL-\ mi scrive Quit (core dumped) ed esce dalla shell. E' normale come comportamento?

3 - Per quanto riguarda i comandi builtin della mia shell, ho creato un file txt con una lista di comandi interni (tipo alias, cd, pwd ecc.). Il problema è che qualsiasi comando faccia partire di questi, la execvp mi ritorna sempre con un errore dicendo "No such file or directory".

Ditemi se devo postarvi qualche pezzo di codice, perché è molto lungo. Grazie.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 30-12-2006, 20:49   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Manugal
1 - Eseguendo la execvp ad esempio con ls, ho l'output di ls normalmente; se invece aggiungo un argomento ad esempio per eseguire ls -l non mi fa vedere l'output come dovrebbe essere con l'opzione -l ma me lo fa vedere come se non ci fosse tale opzione. E' come se ignorasse gli argomenti, non capisco perché.
Ecco un banale esempio (senza fork per cui sostituisce il processo e basta).
Codice:
#include <stdio.h>
#include <unistd.h>

int main (void)
{
    char *args[4];

    args[0] = "ls";
    args[1] = "-laA";
    args[2] = "/tmp";
    args[3] = NULL;

    execvp (args[0], args);  /* Lancia: ls -laA /tmp */

    return 0;
}
Quote:
Originariamente inviato da Manugal
3 - Per quanto riguarda i comandi builtin della mia shell, ho creato un file txt con una lista di comandi interni (tipo alias, cd, pwd ecc.). Il problema è che qualsiasi comando faccia partire di questi, la execvp mi ritorna sempre con un errore dicendo "No such file or directory".
Beh, certo è normale! Se sono comandi "built-in" vuol dire che non sono degli eseguibili esterni presenti in qualche punto del file-system!!

Quando la shell riceve un comando "built-in" dal prompt (o leggendo uno script), ad esempio il comando 'cd', non avvia nulla di esterno. Per il comando 'cd', esso fa nient'altro che chiamare la funzione di sistema int chdir(const char *path);, in modo da cambiare la directory corrente dentro il processo della shell.

Spero cioè di essermi spiegato: molti dei comandi built-in operano sullo stato interno della shell e spesso chiamano semplicemente delle funzioni di sistema. Così, se nella "tua" shell vuoi implementare in comando "pwd", quando lo ricevi (da prompt) devi fare semplicemente così: chiamare la funzione getcwd() e stampare il path ottenuto.
Nota: poi se vai a vedere la documentazione della bash, vedi che pwd ha 2 opzioni: -L e -P. Dipende se devi "replicare" fedelmente la bash oppure no, ma questo tocca a te decidere in base a cosa vuoi/devi fare.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 30-12-2006, 21:02   #3
Devil_Dante
Junior Member
 
Iscritto dal: Dec 2006
Messaggi: 4
Ciao manugal..per caso stai svolgendo questo progetto per l'esame di laboratorio di sistemi della sapienza a roma? perchè anche io devo svolgere lo stesso progetto proprio per questa materia!! Se possibile avrei bisogno di qualche consiglio a riguardo; sono a metà progetto ma ci sono dei punti poco chiari. Fammi sapere
Ciao a presto!
Devil_Dante è offline   Rispondi citando il messaggio o parte di esso
Old 30-12-2006, 21:10   #4
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ah quindi per i comandi interni devo ogni volta chiamare la funzione appropriata? Questo significa che ogni comando ha la sua funzione (cioè fg ha la sua funzione, bg anche, echo anche ecc.) giusto? Saranno almeno una trentina i comandi builtin. Dove le trovo tutte le funzioni associate a ciascun comando?

Per quanto riguarda la prima domanda ad args[0] gli passo direttamente tutto il path del comando, mentre gli altri argomenti li passo tali e quali come mi hai fatto vedere tu. Ma lui si ostina a farmi vedere ls come se lo passassi senza ulteriori argomenti. Non capisco perché. Dimmi se ti serve qualche pezzo di codice.

Grazie.

P.S. Devil_Dante hai un PM
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 30-12-2006, 21:16   #5
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1455
Quote:
Originariamente inviato da Manugal
Ah quindi per i comandi interni devo ogni volta chiamare la funzione appropriata? Questo significa che ogni comando ha la sua funzione (cioè fg ha la sua funzione, bg anche, echo anche ecc.) giusto? Saranno almeno una trentina i comandi builtin. Dove le trovo tutte le funzioni associate a ciascun comando?

Per quanto riguarda la prima domanda ad args[0] gli passo direttamente tutto il path del comando, mentre gli altri argomenti li passo tali e quali come mi hai fatto vedere tu. Ma lui si ostina a farmi vedere ls come se lo passassi senza ulteriori argomenti. Non capisco perché. Dimmi se ti serve qualche pezzo di codice.

Grazie.

P.S. Devil_Dante hai un PM
controlla bene che non fai cosi
execve("ls","-l"), ma bisogna fare come andbin giustamente ti mostra
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 31-12-2006, 11:47   #6
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Guarda controllando con il debugger gdb vedo proprio che gli passa ls e poi -l seguito da NULL. Non capisco perché non mi interpreta il -l.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 31-12-2006, 15:06   #7
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Finalmente ci sono riuscito. Grazie mille a tutti.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 31-12-2006, 16:25   #8
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1455
Quote:
Originariamente inviato da Manugal
Finalmente ci sono riuscito. Grazie mille a tutti.
ps.
Regola fondamentale, quando si risolve un problema va detto anche come lo si è risolto, per due motivi :
1) Altri potrebbero avere lo stesso tuo problema, cercando trovano pure la soluzione
2) Per curiosità di chi ti ha aiutato, per vedere se ha beccato il problema

Buon anno
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 01-01-2007, 13:47   #9
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ok. Praticamente ho risolto chiamando execvp("ls", "ls -l",NULL); cioè vale a dire che "ls -l" è un argomento unico e così lo riesce ad interpretare correttamente.

Ciao e buon anno.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-01-2007, 15:57   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Manugal
Ok. Praticamente ho risolto chiamando execvp("ls", "ls -l",NULL);
Assolutamente sbagliato!! execvp ha il seguente prototipo:

int execvp(const char *file, char *const argv[]);

Il secondo parametro deve essere un array di puntatori a char, non un puntatore a char!!! E il compilatore dovrebbe pure arrabbiarsi.

Se vuoi proprio passare direttamente i parametri nella chiamata, potresti al massimo usare la funzione execlp (nota la 'l' invece della 'v'). Il mio esempio che ho postato prima lo potrei riscrivere con execlp così:

execlp ("ls", "ls", "-laA", "/tmp", NULL);

Ma ripeto, usare execvp come hai appena detto tu, è sbagliato.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2007, 15:42   #11
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Scusa io gli passo un array di puntatori a char (cioè args che è la variabile che ho creato appositamente). Faccio una chiamata così execvp(name,args); (con name che è essenzialmente "ls") solamente che args[0]="ls -l" e args[1]=NULL. Non gli passo infatti un puntatore a char. Se invece args[0]="ls", args[1]="-l" e args[2]=NULL allora così non funziona.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2007, 15:57   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Manugal
Scusa io gli passo un array di puntatori a char
Ah ... volevo dire! Dal tuo precedente post si capiva tutta un'altra cosa ....

Quote:
Originariamente inviato da Manugal
(cioè args che è la variabile che ho creato appositamente). Faccio una chiamata così execvp(name,args); (con name che è essenzialmente "ls") solamente che args[0]="ls -l" e args[1]=NULL.
Così è sbagliato e infatti non dovrebbe funzionare (a me non funziona)

Quote:
Originariamente inviato da Manugal
Se invece args[0]="ls", args[1]="-l" e args[2]=NULL allora così non funziona.
No, così è corretto e dovrebbe funzionare (e a me funziona).


Ti costa molto verificare che:
Codice:
char *args[2];
args[0] = "ls -l";
args[1] = NULL;
execvp ("ls", args);
così non funziona


e che invece:
Codice:
char *args[3];
args[0] = "ls";
args[1] = "-l";
args[2] = NULL;
execvp ("ls", args);
così funziona.

?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2007, 16:05   #13
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Boh strano. Adesso l'ho provato su un sorgente nuovo e funziona come dici tu . Però a me sul programma che sto facendo funziona. Forse mi sono sbagliato a dirti che gli passo gli argomenti in quel modo, mentre in realtà li passo con il tuo sistema. Perché se funziona e fa quello che deve fare è corretto no?
Manugal è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
USA, incriminati tre ingegneri della Sil...
Xbox: Phil Spencer lascia dopo 38 anni, ...
Cuffie e sostanze chimiche: uno studio e...
Terremoto sui dazi USA: la Corte Suprema...
Arianespace potrebbe lanciare il primo r...
Google Pixel 10a disponibile al prezzo m...
Microsoft Copilot nei guai: email riserv...
AOC a 399€ su Amazon: QD-OLED 240 Hz e 0...
La Cina ha recuperato dal mare il primo ...
Boeing CST-100 Starliner: la NASA rende ...
hiop e TaDa uniscono le forze per trasfo...
Thermal Grizzly mostra il Ryzen 7 9850X3...
AMD Ryzen 'Olympic Ridge' Zen 6 per desk...
Donald Trump renderà pubbliche in...
Prezzo mai visto da mesi: ECOVACS DEEBOT...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:26.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v