Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2006, 19:22   #1
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
[C]:minishell

Ciao ragazzi ho bisogno di un aiuto con questo esercizio :

Scrivere una mini schell che iterativamente legge una riga di testo ed esegue il suo contenuto in un processo dedicato (attendendo la terminazione di questo processo). La shell termina col comando stop. (Suggerimenti: per la lettura della linea di comando si puo usare la funzione della libreria c fgets).

Questo è il codice che fino ad ora ho prodotto:

Codice:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char *argv[]){

    int pid;
    int status;
    char *stringa;



    stringa=calloc(20,sizeof(char));
    if  ((stringa=fgets(stringa,20,stdin)) == NULL) exit(1);
    
    while ( strncmp(stringa,"stop",4) != 0){
      if ( (pid = fork()) < 0){
           perror("fork");
           exit(1);
      }else{
         if (pid == 0){//figlio
             if ( execlp(stringa,stringa,(char *)0) < 0 )
                perror("execlp"),exit(1);
         }else{//padre
           //aspetto la terminazione di mio figlio
           wait(&status);
         }//fine else padre
      }//fine else

      if  ((stringa=fgets(stringa,20,stdin)) == NULL) exit(1);
    }//fine while


    exit (0);
}
Una volta letta la stringa iterativamente, come mando in esecuzione la stringa? Ho provato con execlp(stringa,stringa,(char *)0) però non funziona.
Grazie per l'attenzione.
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2006, 19:46   #2
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Dai un'occhiata qui: http://www.advancedlinuxprogramming.com/alp-folder

E' un ottimo libro, ed è g-r-a-t-i-s!
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2006, 21:21   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mercury841
Una volta letta la stringa iterativamente, come mando in esecuzione la stringa? Ho provato con execlp(stringa,stringa,(char *)0) però non funziona.
Intanto ti consiglio di usare un ciclo do-while invece di un while. Il motivo è semplice: la lettura della stringa la devi fare comunque almeno 1 volta, quindi un do-while è più opportuno e logico.

Per la execlp, ti dico subito che dovresti gestire la cosa in modo un po' diverso. Ognuna delle funzioni execXX (ce ne sono ben 5) si aspetta un certo numero di parametri da passare all'nuovo processo. Le exec con la "l" si aspettano una lista di argomenti terminata da un NULL, mentre le exec con la "v" si aspettano un array di char* il cui ultimo elemento è un NULL.

Se in input prendi la stringa "ls -la /etc", dovresti spezzare tu in qualche modo la stringa in modo da ottenere N stringhe, ad esempio: "ls", "-la" e "/etc". La prima stringa è il primo parametro (il nome del programma) da passare alla exec e le restanti stringhe sono gli argomenti. Qundi credo che sia molto meglio usare una delle exec che accetta un array. Creare un array è facile e ti risolve brillantemente il problema.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2006, 21:41   #4
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
Quote:
Originariamente inviato da andbin
Intanto ti consiglio di usare un ciclo do-while invece di un while. Il motivo è semplice: la lettura della stringa la devi fare comunque almeno 1 volta, quindi un do-while è più opportuno e logico.

Per la execlp, ti dico subito che dovresti gestire la cosa in modo un po' diverso. Ognuna delle funzioni execXX (ce ne sono ben 5) si aspetta un certo numero di parametri da passare all'nuovo processo. Le exec con la "l" si aspettano una lista di argomenti terminata da un NULL, mentre le exec con la "v" si aspettano un array di char* il cui ultimo elemento è un NULL.

Se in input prendi la stringa "ls -la /etc", dovresti spezzare tu in qualche modo la stringa in modo da ottenere N stringhe, ad esempio: "ls", "-la" e "/etc". La prima stringa è il primo parametro (il nome del programma) da passare alla exec e le restanti stringhe sono gli argomenti. Qundi credo che sia molto meglio usare una delle exec che accetta un array. Creare un array è facile e ti risolve brillantemente il problema.

Si infatti ci avevo pensato, solo che speravo ci fosse un modo più semplice oppure che si potesse eseguire direttamente tutta la stringa. Grazie per l'aiuto e per la disponibilità,ciao
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2006, 21:50   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mercury841
Si infatti ci avevo pensato, solo che speravo ci fosse un modo più semplice oppure che si potesse eseguire direttamente tutta la stringa.
No, purtroppo le exec ti obbligano a gestire gli argomenti come stringhe separate. Comunque ti assicuro che non è complicatissimo creare dinamicamente un array di char*, spezzare la stringa in input e richiamare la exec.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2006, 13:20   #6
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
Mi potreste dare una mano nell'allocazione di un array di stringhe?Ciao e grazie
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2006, 13:31   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mercury841
Mi potreste dare una mano nell'allocazione di un array di stringhe?Ciao e grazie
Certo! Bisogna solo vedere quanto, per te, è accettabile per dimensionare correttamente l'array.
Mi spiego meglio: se hai in input una stringa lunga al massimo 40 caratteri, supponendo di avere 1 car., 1 spazio, 1 car., ecc..., risulta che puoi avere al massimo 20 parametri.
Ora, 20 parametri sono pochi e l'array lo si potrebbe dichiarare (senza fare nemmeno allocazioni dinamiche) come:
Codice:
char *stringhe[21];   /* uno in più per il NULL finale */
Oppure lo si può allocare dinamicamente specificando una dimensione fissa oppure ancora (soluzione più complessa però) creare una specie di array ridimensionabile a run-time, un po' come succede in altri linguaggi.

Insomma, dipende molto da come vuoi gestire il numero dei parametri.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2006, 14:01   #8
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
Quote:
Originariamente inviato da andbin
Certo! Bisogna solo vedere quanto, per te, è accettabile per dimensionare correttamente l'array.
Mi spiego meglio: se hai in input una stringa lunga al massimo 40 caratteri, supponendo di avere 1 car., 1 spazio, 1 car., ecc..., risulta che puoi avere al massimo 20 parametri.
Ora, 20 parametri sono pochi e l'array lo si potrebbe dichiarare (senza fare nemmeno allocazioni dinamiche) come:
Codice:
char *stringhe[21];   /* uno in più per il NULL finale */
Oppure lo si può allocare dinamicamente specificando una dimensione fissa oppure ancora (soluzione più complessa però) creare una specie di array ridimensionabile a run-time, un po' come succede in altri linguaggi.

Insomma, dipende molto da come vuoi gestire il numero dei parametri.
Si grazie per l'aiuto. Se invece non volessi dare una dimensione fissa all'array ma di volta in volta a seconda del numero di parametri riallocarmi lo spazio necessario con l'utilizzo di realloc????
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2006, 14:17   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mercury841
Si grazie per l'aiuto. Se invece non volessi dare una dimensione fissa all'array ma di volta in volta a seconda del numero di parametri riallocarmi lo spazio necessario con l'utilizzo di realloc????
Si può fare (e in mille modi diversi ).

Io ad esempio farei così: una struttura
Codice:
typedef struct
{
    char **strings;
    int    size;
    int    capacity;
} STRING_ARRAY;
Poi farei una serie di funzioni, per 1) Inizializzare la struttura, 2) De-inizializzare la struttura, 3) Aggiungere una stringa all'array.

Poi tutta la "logica" di (ri)allocazione dell'array è da fare ovviamente!
Pensaci un po', poi al massimo butto giù (appena ho tempo) del codice.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2006, 22:31   #10
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
Ho fatto in questo modo, sembra funzionare. Mentre se utilizzo la funzione dealloca, che adesso è commentata nel codice, non funziona.Qualcuno ha idea di quale sia il motivo?????
Codice:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>


char **crea_vettore(char *stringa);
void dealloca(char **array_di_stringhe);

int main (int argc, char *argv[]){

    int pid,i;
    int status;
    char *stringa;//stringa dove memorizzo la stringa dei comandi
    char **stringhe; //array di stringhe



    stringa=(char *)calloc(20,sizeof(char));

    if  ((stringa=fgets(stringa,20,stdin)) == NULL) exit(1);
    while ( strncmp(stringa,"stop",4) != 0){

          stringhe=crea_vettore(stringa);
          if ( (pid = fork()) < 0){
               perror("fork");
               exit(1);
          }else{
                if (pid == 0){//figlio
                    if ( execvp(stringhe[0],stringhe) < 0 )
                        perror("execvp"),exit(1);
                }else{//padre
                      //aspetto la terminazione di mio figlio
                      wait(&status);
                      //dealloca(stringhe);//libero memoria
                }//fine else padre
          }//fine else

          if  ((stringa=fgets(stringa,20,stdin)) == NULL) exit(1);
    }//fine while


    exit (0);
}

char **crea_vettore(char *stringa){

    char **stringhe;
    char *parola=NULL;
    int i=0,
        size=1,
        j=0;

    if ((stringhe=(char **)malloc(size*sizeof(char *))) == NULL)
            perror("malloc"),exit(1);//errore allocazione

    while ( stringa[i] != '\0' ){//scandisco tutta la stringa e la divido in tante parole

            while ( (stringa[i] != ' ') && (stringa[i] != '\0') && (stringa[i] != '\n')){
               //costruisco la parola
               parola=(char *)realloc(parola,(j+1)*sizeof(char *));
               parola[j]=stringa[i];
               j=j+1;
               i=i+1;
            }
            if ( ( stringa[i] == ' ') || (stringa[i] == '\n') )
                    i=i+1;
            printf("parola= %s\n",parola);
            if (parola != NULL){//parola trovata
                    stringhe=(char **)realloc(stringhe,(size+1)*sizeof(char *));
                    if ( (stringhe[size-1]=(char *)malloc(strlen(parola)+1)) == NULL)
                            perror("malloc"),exit(1);//errore allocazione
                    strcpy(stringhe[size-1],parola);
                    size=size+1;
            }
            parola=NULL;
            j=0;
    }
    stringhe[size-1]=NULL;//fine dell array di stringhe

    return (stringhe);
}


void dealloca(char **array_di_stringhe){

int i=0;

        while ( array_di_stringhe[i] != NULL ){
                free(array_di_stringhe[i]);
                i=i+1;
        }
        free(array_di_stringhe[i]);
        free(array_di_stringhe);
        return;

}
mercury841 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
CAS Space ha lanciato per la prima volta...
Qualcomm boccia Samsung: i futuri chip S...
Il razzo spaziale cinese Tianlong-3 di S...
Samsung cambia i piani: aumenta la produ...
TSMC non si ferma più: fatturato ...
Xiaomi porta in Italia il nuovo Redmi A7...
Mercato smartphone: Q1 2026 positivo (+1...
YouTube punta sull'AI: gli utenti potran...
Il prossimo chip a 2 nm di Samsung punte...
Due smartphone REDMAGIC sono stati rimos...
La beta della One UI 8.5 è ora di...
Addio al Pannello di Controllo di Window...
Il chip N1 di NVIDIA per i laptop del fu...
YouTube Premium costerà di pi&ugr...
I nuovi Samsung Galaxy A57 5G e A37 5G a...
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: 02:13.


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