Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] Passaggio da linea di comando operatore pipe

    Salve, devo fare un esercizio che simula la seguente pipeline eseguibile da shell di unix: ps -f | grep *.txt | wc -c

    Penso di averlo fatto, pero' non riesco a passare da linea di comando (richiesta dell'esercizio) quella stringa, perchè il carattere '|' viene visto come l'operatore di pipeline, e non mi viene eseguito il codice ma prova a fare la pipeline.

    Io ho provato a lanciare cosi' l'eseguibile
    ./nomeseguibile ps -f | grep *.txt | wc -c

    Qualcuno sa come risolvere? grazie

  2. #2
    prova a raggruppare i parametri con i doppi apici
    ./nomeseguibile "ps -f | grep *.txt | wc -c"

  3. #3
    fai come ti ha detto Massachusetts e ricordati che puoi utilizzare il carattere di escape \.
    Ad esempio, ottieni lo stesso risultato con

    codice:
    ./main ps\ -f\ \|\ grep\ \*.txt\ \|\ wc\ -c
    In questo caso è parecchio scomodo, però può tornarti utile per altro.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Volendo c'è anche il quoting forte

    ./nomeseguibile 'ps -f | grep *.txt | wc -c'

    ma comunque ho come l'impressione che non sia questo quello che si aspetta l'eseguibile di mishima... :D
    every day above ground is a good one

  5. #5
    grazie per le risposte, al momento il codice è questo, probabilmente contiene degli errori ma a causa del problema che ho postato non ho potuto ancora testarlo.

    codice:
     /* Scrivere un programma C e Posix che implementi la seguente pipeline acquisita da input
      * da riga di comando: ps -f | grep *.txt | wc -c */ 
     
     #include <stdio.h>
     #include <stdlib.h>
     #include <unistd.h>
     #include <sys/wait.h>
     #include <sys/types.h>
     #include <errno.h>
     
     int main(int argc, char *argv[])
     {
       pid_t figlioA, figlioB;
       int fdpipe1[2], fdpipe2[2], i;
       
       if (argc!=9)
         printf("%d\n", argc);
       
       pipe(fdpipe1);
       
       if ((figlioA = fork()) < 0)      //Creazione figlio A
         perror("Errore fork1");
       else if (figlioA == 0) {         //Figlio A
         close(fdpipe1[0]);
         dup2(fdpipe1[1], 1);
         pipe(fdpipe2);
         dup2(fdpipe2[0], 0);
         if ((figlioB = fork()) < 0)    //Creazione figlio B, figlio di A 
           perror("Errore fork2");
         else if (figlioB == 0){        //Figlio B
           close(fdpipe2[0]);
           dup2(fdpipe2[1], 1);
           close(fdpipe2[1]);
           execlp(argv[1], argv[1], argv[2], NULL);
         }
         else {                         //Continuo figlio A
           waitpid(figlioB, NULL, 0);
           close(fdpipe2[1]);
           execlp(argv[4], argv[4], argv[5], NULL);
         }
       }
       else {                          //Il padre 
         close(fdpipe1[1]);
         dup2(fdpipe1[0], 0);
         waitpid(figlioA, NULL, 0);
         execlp(argv[7], argv[7], argv[8], NULL);
       }
     }
    Detta in breve, il padre crea 1 figlio A, il figlio A crea un figlio B. Il figlio B esegue la ps, il figlio A la grep, il padre wc.
    Ora coi vostri consigli, sia con " ", che con ' ', il risultato di argc è 2, cioè il nome dell'eseguibile e la scritta, ora dovrei fare un parsing su argv[2] e sistemarmi il codice immagino.

    Giusto? Notate altri problemi?

    EDIT: Pero' pensandoci, mi sembra stupido fare un parsing, potrei semplicemente vedere se la stringa è stata scritta in quella maniera con una strcmp e poi mettere nelle varie execlp le parti che mi servono come stringhe. Questo rendebbe l'esercizio abbastanza strano pero', sono forse io che mi faccio troppi problemi?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Fai l'esercizio staticamente e basta. Il primo processo esegue ps -f, il secondo grep *.txt e il terzo wc -c, d'altra parte l'esercizio ti chiede di implementare proprio quella pipe, non una pipe generica. Lascia perdere l'input da riga di comando e il parsing, a meno che tu non abbia voglia di ricreare la shell bash :D

    btw, al di là dell'esercizio non capisco che risultato possa dare una pipe come quella... ps -f | grep *.txt... sono sicuro che nel 99% dei casi quella pipe non restituirà nulla da dare in input a wc -c, perché non vedo come possa esserci una stringa terminante con .txt in una lista di processi (a meno che non ci sia un programma in esecuzione proprio su un file del genere) ma comunque vabbè :)
    every day above ground is a good one

  7. #7
    ritorna un numero pero' diverso se uso il programma rispetto a se non lo uso

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Eh? :D
    every day above ground is a good one

  9. #9
    ./ese "ps -f | grep *.txt | wc -c" da un numero
    ps -f | grep *.txt | wc -c da un altro numero

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    No ma fai attenzione... se tu passi al programma la stringa

    "ps -f | grep *.txt | wc -c"

    argc varrà 2 e il programma avrà in input non 8 stringhe, ma una sola... che è appunto la pipe intera. Con "staticamente" prima intendevo proprio specifiare nella execlp() di ciascun processo il programma che deve eseguire con relativa opzione, quindi

    execlp("ps", "ps", "-f", NULL);

    ecc...

    Comunque non ho visto tutto il codice, ma ci sono alcune cose che non mi convincono: entrambe le pipe, ad esempio, dovrebbero essere inizializzate prima della creazione dei vari processi per evitare problemi, inoltre non ho ben capito come vuoi far avvenire la comunicazione: il processo che esegue "ps -f" è il primo della pipeline, quindi dovrebbe chiudere per intero fdpipe2 e lasciare aperta fdpipe1 solo in scrittura, duplicando poi il file descriptor su quello dello stdout (1)...
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.