Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    26

    [C] concatenazione comandi

    ciao a tutti!
    ho un problema con la programmazione in C
    devo fare un programma che mi esegua il comando
    grep a testo.txt|wc -w
    della shell linux utilizzando le procedure fork() e execlp(): qualcuno sa aiutarmi nella concatenazione dei due comandi?
    grazie mille.....

  2. #2
    Utente di HTML.it L'avatar di frznn
    Registrato dal
    Apr 2008
    Messaggi
    108
    hai bisogno di una struttura detta "pipe". Questa è un (doppio) buffer condiviso tra 2 programmi.
    Su Unix esiste la system call int pipe(int filedes[2]);
    questa ritorna due filedescriptor mettendoli in filedes. filedes[0] è aperto in lettura, mentre filedes[1] è aperto in scrittura. Ora, l'output di filedes[0] è l'input di filedes[1].

    normalmente il processo che chiama pipe, chiama fork(), i descrittori vengono così duplicati, creando un canale di comunicazione tra parent e child (o viceversa). quindi ci sono 4 filedescriptor (2 per il processo parent e 2 per il child). Visto che la comunicazione tra un processo e se stesso è del tutto inutile, il parent chiude l'estremo di input (close(fd[0])), mentre il child quello di output (close(fd[1])). a questo punto si possono usare normalmente la read e la write usando i filedescriptor.
    naturalmente supponendo che tu stia programmando una shell, sarà questa a creare la pipe, chiamando successivamente 2 fork(), chiudendo i filedes opportuni, e successivamente sostituendo la propria immagine con quella del programma desiderato (exec()).

    Direi che ti ho detto abbastanza, il resto lo lascio a te.
    *** Rock n' Roll ain't noise pollution ***

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    26
    ....ho capito la teoria.....
    però non ho capito il finale, nel senso: io non devo fare questi fork perchè si arrangia la shell a crearli?
    e altra cosa: come gestisco l'exec?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    26
    ....io ho scritto questa funzione, però la pipe continua a darmi errori....

    int ciao() {
    printf("sono nella funzione \n");

    int i=fork();
    switch(i) {
    case -1:
    printf("errore fork \n");
    break;
    case 0:
    printf("sono il figlio, adesso faccio un altro fork \n");
    int filedes[2];
    int pipe(filedes);
    int j=fork();
    switch(j) {
    case -1:
    printf("errore\n");
    break;
    case 0:
    printf("sono il nipote, adesso provo a usare la pipe\n");
    output(close(filedes[1]));
    execlp("wc","wc","-w",NULL);
    break;
    case 1:
    input(close(filedes[0]));
    execlp("grep","grep","c","testo.txt",NULL);
    break;
    default:
    exit(0);
    }
    break;
    default:
    wait(5);
    printf("AAAA \n");
    exit(0);
    }

  5. #5
    Utente di HTML.it L'avatar di frznn
    Registrato dal
    Apr 2008
    Messaggi
    108
    Originariamente inviato da pixx
    ....ho capito la teoria.....
    però non ho capito il finale, nel senso: io non devo fare questi fork perchè si arrangia la shell a crearli?
    e altra cosa: come gestisco l'exec?
    naturalmente devi fare tu le fork, io ho solo supposto che stessi scrivendo una shell, visto che devi eseguire una pipe.

    Ora, venendo alla funzione scritta da te, ci sono due cose da dire:
    1. la fork (in caso di successo), al processo parent non torna 1, ma un valore maggiore di 0, corrispondente al pid del processo figlio.
    2. prima di chiamare l'exec, devi redirigere l'output del processo sulla pipe, altrimenti ciò che scriveranno o leggerano tali processi sarà semplicemente lo stdin e lo stdout. Per redirigere l'output puoi usare la funzione dup2 (vedi tu come funziona).

    il concetto è:

    pid=fork();

    if(pid==0){
    pipe(fd);
    pid=fork();

    if(pid > 0){
    close(fd[0]); //chiude l'estremo di input
    dup2(fd[1],1); //redirige l'output sulla pipe
    exec(cmdA);
    }
    else if(pid == 0){
    close(fd[1]); //chiude l'estremo di output
    dup2(fd[0],0); //redirige l'input sulla pipe
    execv(cmdB);
    }
    }
    *** Rock n' Roll ain't noise pollution ***

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 © 2026 vBulletin Solutions, Inc. All rights reserved.