Torna indietro   Hardware Upgrade Forum > Software > Programmazione

 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
Abbiamo intervistato Sumit Dhawan, CEO di Proofpoint, per capire come stia cambiando il mondo della sicurezza con l'avvento dell'intelligenza artificiale e con il ritmo sempre più serrato a cui vengono trovate vulnerabilità nel software. Un problema significativo, che richiederà del tempo per essere risolto (o quantomeno arginato)
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
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
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
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
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
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
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
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
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


 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
La sovranità digitale non è...
ESS obbligatorio da luglio: il rivoluzio...
Batterie Tesla rubate direttamente fuori...
Il Governo statunitense anticipa di 5 an...
Steam Machine costa troppo? Non per i ba...
AWS e Azure sono gatekeeper e vanno rego...
Huawei presenta una nuova infrastruttura...
Logitech G e Activision uniscono le forz...
Snapdragon Summit 2026: ecco quando sara...
Sardegna, debutta il primo treno a idrog...
CXMT non ci salverà dai prezzi de...
Tidal contro la musica creata con l'inte...
Videproiettore compatto XGIMI MoGo 2 Pro...
Narwal rilancia su Amazon per il post-Pr...
Il regista di 47 Ronin ha frodato Netfli...
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: 18:15.


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