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.