Problema con le pipe [C]

di il
2 risposte

Problema con le pipe [C]

Salve volevo fare un programma in C che simulasse il comando bash: ps -ef | grep http | wc -l
ma non mi da lo stesso risultato il comando da terminale mi da 1 mentre il programma 0

il mio codice:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>

int pid1,pid2,r;
int pipefd[2],pipefd2[2];

#define SYSCALL(r,c,e) \
	if((r=c)==-1) { perror(e);exit(errno); }

int main(){
	SYSCALL(r,pipe(pipefd),"pipe");
	SYSCALL(pid1,fork(),"fork");
	if (pid1==0){
		close(pipefd[0]);
		SYSCALL(r,dup2(pipefd[1],1),"dup");
		SYSCALL(r,pipe(pipefd2),"pipe");
		SYSCALL(r,dup2(pipefd2[0],0),"dup");
		SYSCALL(pid2,fork(),"fork");
		if(pid2==0){	
			close(pipefd2[0]);
			SYSCALL(r,dup2(pipefd2[1],1),"dup");
			close(pipefd2[1]);
			SYSCALL(r,execlp("ps","ps","-ef",NULL),"exec");		
		}else{
			SYSCALL(r,waitpid(pid2,NULL,0),"wait");
			close(pipefd2[1]);
			close(pipefd2[0]);
			SYSCALL(r,execlp("grep","grep","http",NULL),"exec");
		}
	}else{
		close(pipefd[1]);
		SYSCALL(r,dup2(pipefd[0],0),"dup");
		SYSCALL(r,waitpid(pid2,NULL,0),"wait");
		close(pipefd[0]);
		SYSCALL(r,execlp("wc","wc","-l",NULL),"exec");
	}	
	return(0);
}
Credo che sia facile da capire come funziona anche senza altri commenti.
Avevo già fatto altri esercizi con le pipe però di due comandi e basta (tipo: ls | sort ) con tre o di più non mi riescono quindi oltre che a darmi la soluzione per questo problema c'è qualcuno che mi potrebbe spiegare un po' come vanno fatte in generale? e si poteva fare anche con un unica pipe questo es?
Grazie in anticipo.

2 Risposte

  • Re: Problema con le pipe [C]

    Quella SYSTEMCALL rompe la leggibilità del codice.
    
    int main()
    {
        int pfd[2];
        pipe(pfd);
        dup2(spfd[0], STDIN_FILENO);
    
        pid_t pid = fork();
        if (pid == 0){
            close(pfd[0]);
            dup2(pfd[1], STDOUT_FILENO);
            close(pfd[1]);
    
            int spfd[2];
            pipe(spfd);
            dup2(spfd[0], STDIN_FILENO);
    
            pid_t spid = fork();
            if ( spid == 0 ){
                close(spfd[0]);
                dup2(spfd[1], STDOUT_FILENO);
                close(spfd[1]);
                
                execlp("ps","ps","-ef",NULL);
                exit(2);
            }else{
                close(spfd[0]);
                waitpid(spid,NULL,0);
                execlp("grep","grep","http",NULL);
                exit(1);
            }
        }
        waitpid(pid,NULL,0)
        execlp("wc","wc","-l",NULL);
        exit(0);
    }
    
    Potrebbe esserci qualche errore dato che l'ho scritto via telefono, comunque penso che il concetto sia chiaro.
  • Re: Problema con le pipe [C]

    Non va si blocca il codice...lo so è noisa da vedere ma il professore ci tiene alla gestione dell'errore
Devi accedere o registrarti per scrivere nel forum
2 risposte