Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fcntl.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <signal.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/wait.h>
- #define MAX_CHILD_NUMBER 10
- /**************************/
- /* DICHIARAZIONE FUNZIONI */
- /**************************/
- void process_pn(int i, int pid);
- void figlio(char* filterc);
- /*********************/
- /* VARIABILI GLOBALI */
- /*********************/
- int n;
- char* input;
- char* output;
- char* filterc[MAX_CHILD_NUMBER];
- int fd_n[2];
- int main(int argc, char* argv[]){
- int pid, i;
- if (argc < 4) {
- fprintf(stderr, "Numero di argomenti errato.\nUsage:\n\t%s file1 file2 C\n",argv[0]);
- exit(EXIT_FAILURE);
- }
- input = argv[1];
- n = argc - 3;
- for(i=0; i<n; i++)
- filterc[i] = argv[i+2];
- output = argv[argc - 1];
- for (i=0; i<n; i++) {
- pipe(fd_n);
- pid = fork();
- if (pid < 0){
- fprintf(stderr, "P0: Errore nella fork");
- exit(EXIT_FAILURE);
- }
- else
- if (pid == 0) {
- process_pn(i, pid);
- }
- else {
- printf("P0: creato figlio P%d con PID %d\n", i+1, pid);
- close(0);
- dup(fd_n[0]);
- close(fd_n[0]);
- }
- }
- exit(0);
- return 0;
- }
- void process_pn(int i, int pid) {
- int fd_in, fd_out, nread, size;
- char* buf;
- if(i==0 && pid==0) { /*INPUT*/
- printf("P1 legge e salva in pipe\n");
- close(0);
- open(input, O_RDONLY);
- close(fd_n[0]);
- close(1);
- dup(fd_n[1]);
- close(fd_n[1]);
- figlio(filterc[i]);
- }
- else
- if(i==n-1 && pid==0) {/*OUTPUT*/
- printf("P%d legge dalla pipe precedente e salva in output\n", i+1);
- close(1);
- open(output, O_WRONLY | O_CREAT, 0777);
- close(fd_n[1]);
- close(fd_n[0]);
- figlio(filterc[i]);
- }
- else if(pid == 0) {
- printf("P%d legge dalla pipe precedente e scrive nella sua pipe\n", i+1);
- close(1);
- dup(fd_n[1]);
- close(fd_n[1]);
- figlio(filterc[i]);
- }
- return;
- }
- void figlio(char*filterc){
- char c,d[2];
- int i;
- while((i=read(0,&c,sizeof(char)))>0){
- d[0]=c;
- d[1]='\0';
- if(strcmp(filterc,d)!=0){
- write(1,&c,sizeof(char));
- }
- }
- close(1);
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement