Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2006, 20: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, 20: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, 22: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, 22: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, 22: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, 14: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, 14: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, 15: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, 15: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, 23: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


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...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
L'eVTOL tedesco per missioni mediche e m...
Zscaler Threat Report 2026: l'adozione d...
Claude AI minaccia omicidi e ricatti qua...
Dentro la gara: a Milano Cortina 2026 i ...
Samsung Display presenta QD-OLED Penta T...
KONAMI torna con "Silent Hill: Town...
Rende il citofono smart a 44,99€: Ring I...
ThunderX3 XTC, la sedia da ufficio che s...
Mercy, Mission Impossible, Aronofsky: il...
Project Windless: il nuovo action in esc...
Saros: mostrato il gameplay del gioco de...
God of War: Sons of Sparta annunciato e ...
John Wick torna in un nuovo videogioco a...
MADE chiude il 2025 con 59 partner e 250...
007 First Light: allo State of Play un n...
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: 08:50.


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