Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [C] All'inizio con le Pipe

    Ciao a tutti,
    sto iniziando a programmare con le pipe e volevo realizzare il programma:

    who | wc -l

    il codice e' questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <sys/wait.h>
    
    int main( int argc, char *argv[] )
    {
    	pid_t pid;
    	int pipein[2], pipeout[2];
    	int retval;
    	
    	retval = pipe( pipein );
    	retval = pipe( pipeout );
    	
    	pid = Fork();
    	
    	if( pid == 0 )		/* Primo Figlio */
    	{
    		close( pipein[1] );
    		dup2( pipein[0], STDIN_FILENO );
    		close( pipeout[0] );
    		dup2( pipeout[1], STDOUT_FILENO );
    		if( execlp( "/usr/bin/who", "who", NULL ) == -1 )
    		{
    			perror("exec" );
    			exit(errno);
    		}
    	}
    	
    	close( pipein[1] );
    	waitpid( pid, NULL, 0 );
    	
    	pid = Fork();
    	
    	if( pid == 0 )		/* Secondo Figlio */
    	{
    		close( pipeout[1] ); 
    		dup2( pipeout[0], STDIN_FILENO );
    		if( execlp( "/usr/bin/wc", "wc", "-l", NULL ) == -1 )
    		{
    			perror("exec");
    			exit(errno);
    		}
    	}
    	close( pipeout[0] );
    	waitpid( pid, NULL, 0 );
    	
    	return 0;
    }
    quando lo mando in esecuzione si blocca, cioe' resta in attesa e non scrive niente e devo terminarlo con ctrl+c

    Ho provato a vedere se la who funzionava, e funzione. Cioe' se stampo nella seconda fork() pipeout[0] effettivamnte c'e' il risoltato della who, quindi il problema credo sitia nella cw, potete aiutarmi?

    Grazie!
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    nessuno sa come risolvere il problema?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  3. #3
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    non capisco che senso abbia

    waitpid( pid, NULL, 0 )

    dopo la creazione del primo processo.
    In questo modo i due processi non possono comunicare se aspetti la terminazione del primo prima che il secondo venga creato...
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  4. #4
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    non so se ti serve ancora cmq:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <unistd.h>
    ...
    void main()
    {
    int pfd[2], rc, nread;
      if (pipe(pfd) == 1)
     {
       perror(“pipe”);
       exit(1);
     }
    rc=fork();
     if (rc == 0) {
       close(pfd[0]);
       dup2(pfd[1], 1);
       fprintf(stderr,"Sono il figlio, adesso eseguo who");
       execlp("who","who", NULL);
      }
      else {
        close(pfd[1]);
        dup2(pfd[0], 0);
        fprintf(stderr, "Sono il padre, adesso eseguo wc");
        execlp("wc"," wc", NULL);
    }
    }
    a me servirebbe se qualcuno sa come implementare le piep concatenate, cioè come posso fare a metterne infinite..

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C] All'inizio con le Pipe

    Originariamente inviato da Poker1
    Ciao a tutti,
    sto iniziando a programmare con le pipe e volevo realizzare il programma:

    who | wc -l
    Basta usare 1 sola pipe (2 descrittori) e fare 1 solo wait alla fine:
    Risulterebbe così:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <sys/wait.h>
    
    int main (void)
    {
        pid_t pid;
        int   fd_pipe[2];
        int   r;
    
        r = pipe (fd_pipe);
    
        pid = fork ();
    
        if (pid == 0)       /* Primo Figlio */
        {
            dup2 (fd_pipe[1], STDOUT_FILENO);
            close (fd_pipe[0]);
            close (fd_pipe[1]);
    
            if (execlp ("/usr/bin/who", "who", NULL) == -1)
            {
                perror ("exec");
                exit (errno);
            }
        }
    
        pid = fork ();
    
        if (pid == 0)       /* Secondo Figlio */
        {
            dup2 (fd_pipe[0], STDIN_FILENO);
            close (fd_pipe[0]);
            close (fd_pipe[1]);
    
            if (execlp ("/usr/bin/wc", "wc", "-l", NULL) == -1)
            {
                perror ("exec");
                exit (errno);
            }
        }
    
        close (fd_pipe[0]);
        close (fd_pipe[1]);
    
        waitpid (pid, NULL, 0);
    
        return 0;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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.