[C] Processo Pipe

di il
6 risposte

[C] Processo Pipe

Salve a tutti. Sto riscontrando un problema con questo esercizio praticamente nel momento in cui arrivo nel processo padre mi stampa messaggio incompleto pur inserendo un valore intero come richiesto dalla traccia. L'ho visionato con cura prestando attenzione a tutto eppure mi sfugge qualcosa. Grazie mille a chi mi aiuterà.


https://onlinegdb.com/vaWbnDnc -> il link del codice
/*****************************************************************
Il candidato completi il programma fornito, implementando il main.
Il programma crea un processo figlio; il processo figlio legge
da tastiera un numero intero N >= 0, e trasmette al processo padre
mediante una pipe i valori N, N-1, N-2, N-3, ..., 0 (incluso).
Il processo padre legge dalla pipe i valori trasmessi dal processo figlio
e li stampa, finche' non riceve il valore 0; dopodiche' il processo
padre attende la terminazione del processo figlio e termina.


Esempio:
Sono il processo figlio. Inserisci un numero >=0: 4
Sono il processo padre. Ho ricevuto: 4
Sono il processo padre. Ho ricevuto: 3
Sono il processo padre. Ho ricevuto: 2
Sono il processo padre. Ho ricevuto: 1
Sono il processo padre. Ho ricevuto: 0
Sono il processo padre. Il figlio ha terminato.
******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
    int fd[2];
    int N;

    /* Creazione della pipe */
    if(pipe(fd) < 0){
        printf("Errore nella creazione pipe\n");
        return -1;
    }
   
    pid_t pid = fork(); // la chiamata fork crea un processo figlio
   
    /* Il codice a seguire viene eseguito da entrambi i processi: padre e figlio */
    if(pid < 0) {
        /* Errore verificato */
        printf("Fork non riuscita\n");
        return -1;
    } else if(pid == 0) {
        /* Processo Figlio */
        close(fd[0]); // Non interessato a leggere
       
        /* Preparazione del messaggio */
        printf("Sono il processo figlio. Inserisci un numero interno >= 0: ");
        scanf("%d", &N);
        
        if(N < 0){
            return -1;
        }
        int array[N];
        
        for(int i = 0; i <= N; i++){
            array[i] = i;
        }
        
        /* Inviare il messaggio */
        int inviati = write(fd[1], array, N*sizeof(int));
        
        
        if(inviati != sizeof(array)) {
            printf("Errore nell'invio\n");
            return -1;
           
        }
        close(fd[1]);
        return 0;
    } else {
        /* Processo Padre */
        close(fd[1]); // Non interessato a scrivere
        int array[N];
       int ricevuti = read(fd[0], &array, N*sizeof(int));
       
        if(ricevuti < 0) {
            printf("Errore nella ricezione\n");
        } else if(ricevuti < sizeof(array)) {
            printf("Messaggio incompleto\n");
        } else {
            printf("Numeri ricevuti: ");
            int i;
            for(i=N; i>=0; i--) {
           printf("%d", array[i]);
           printf("\n");
        }
        }
        close(fd[0]);
        return 0;
    }
}

6 Risposte

  • Re: [C] Processo Pipe

    Non hai ancora chiaro che in C gli indici degli array vanno da 0 a N-1

    Questo

    for(int i = 0; i <= N; i++){

    deve essere

    for(int i = 0; i < N; i++){

    e questa

    for(i=N; i>=0; i--)

    ... dimmi tu
  • Re: [C] Processo Pipe

    Ecco il codice aggiornato. Devo soltanto capire perchè non mi stampa i valori
    /*****************************************************************
    Il candidato completi il programma fornito, implementando il main.
    Il programma crea un processo figlio; il processo figlio legge
    da tastiera un numero intero N >= 0, e trasmette al processo padre
    mediante una pipe i valori N, N-1, N-2, N-3, ..., 0 (incluso).
    Il processo padre legge dalla pipe i valori trasmessi dal processo figlio
    e li stampa, finche' non riceve il valore 0; dopodiche' il processo
    padre attende la terminazione del processo figlio e termina.
    
    
    Esempio:
    Sono il processo figlio. Inserisci un numero >=0: 4
    Sono il processo padre. Ho ricevuto: 4
    Sono il processo padre. Ho ricevuto: 3
    Sono il processo padre. Ho ricevuto: 2
    Sono il processo padre. Ho ricevuto: 1
    Sono il processo padre. Ho ricevuto: 0
    Sono il processo padre. Il figlio ha terminato.
    ******************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    int main(int argc, char *argv[]) {
        int fd[2];
    
        /* Creazione della pipe */
        if(pipe(fd) < 0){
            printf("Errore nella creazione pipe\n");
            return -1;
        }
       
        pid_t pid = fork(); // la chiamata fork crea un processo figlio
       
        /* Il codice a seguire viene eseguito da entrambi i processi: padre e figlio */
        if(pid < 0) {
            /* Errore verificato */
            printf("Fork non riuscita\n");
            return -1;
        } else if(pid == 0) {
            /* Processo Figlio */
            close(fd[0]); // Non interessato a leggere
           
            /* Preparazione del messaggio */
            int N;
            printf("Sono il processo figlio. Inserisci un numero interno >= 0: ");
            scanf("%d", &N);
            
            if(N < 0){
                return -1;
            }
            int array[N+1];
            
            for(int i = 0; i < N; i++){
                array[i] = i;
            }
            
            /* Inviare il messaggio */
            int inviati = write(fd[1], array, sizeof(int));
            
            
            if(inviati != sizeof(N)) {
                printf("Errore nell'invio\n");
                return -1;
               
            }
            close(fd[1]);
            return 0;
        } else {
            /* Processo Padre */
            close(fd[1]); // Non interessato a scrivere
            int N;
            int array[N+1];
           int ricevuti = read(fd[0], &array, sizeof(N));
           
            if(ricevuti < 0) {
                printf("Errore nella ricezione\n");
            } else if(ricevuti < sizeof(N)) {
                printf("Messaggio incompleto\n");
            } else {
                printf("Numeri ricevuti: ");
                int i;
                for(i=N-1; i>=0; i--) {
               printf("%d", array[i]);
               printf("\n");
            }
            }
            close(fd[0]);
            return 0;
        }
    }
    
  • Re: [C] Processo Pipe

    Non l'hai aggiornato online.

    Comunque, cosa c'entra sizeof(N) ? E cosa c'entra l'array ?

    Vedi questo
    
    int main(int argc, char *argv[]) {
        int fd[2];
    
        /* Creazione della pipe */
        if(pipe(fd) < 0){
            printf("Errore nella creazione pipe\n");
            return -1;
        }
       
        pid_t pid = fork(); // la chiamata fork crea un processo figlio
       
        /* Il codice a seguire viene eseguito da entrambi i processi: padre e figlio */
        if(pid < 0) {
            /* Errore verificato */
            printf("Fork non riuscita\n");
            return -1;
        } else if(pid == 0) {
            /* Processo Figlio */
            close(fd[0]); // Non interessato a leggere
           
            /* Preparazione del messaggio */
            int N;
            printf("Sono il processo figlio. Inserisci un numero interno >= 0: ");
            scanf("%d", &N);
            
            if(N < 0){
                return -1;
            }
              
            /* Inviare il messaggio */
            for(int i=N; i>=0; i--)
            {
               int inviati = write(fd[1], &i, sizeof(i));
               if(inviati != sizeof(int)) {
                printf("Errore nell'invio\n");
                return -1;
              }
            }
            
            close(fd[1]);
            return 0;
        } else {
            /* Processo Padre */
            close(fd[1]); // Non interessato a scrivere
            int i;
            
            do {
                int ricevuti = read(fd[0], &i, sizeof(i));
    
                if(ricevuti < 0) {
                    printf("Errore nella ricezione\n");
                } else if(ricevuti < sizeof(i)) {
                    printf("Messaggio incompleto\n");
                } else {
                    printf("Valore ricevuto: %d\n", i);
                }
            } while(i);
            
            close(fd[0]);
            return 0;
        }
    }
    
  • Re: [C] Processo Pipe

    Avevo creato l'array per immagazzinare i valori mentre sizeof(N) per la dimensione
  • Re: [C] Processo Pipe

    Comunque grazie mille evidentemente ho interpretato male la traccia
  • Re: [C] Processo Pipe

    Comincia da questo esempio
    
    #include <stdio.h>                  
    #include <stdlib.h>
    #include <unistd.h>               /* UNIX and POSIX constants and functions (fork, pipe) */
    
    int main(){
     int pipefd[2];
     pid_t cpid;
     if (pipe(pipefd) == -1){
       printf("Errore nella pipe()\n");           
       exit(EXIT_FAILURE);
     }
     cpid = fork();
     if (cpid == -1){
       printf("Errore nella fork()\n");
       exit(EXIT_FAILURE);
     }
     if (cpid != 0) {                              
       // parent
       close(pipefd[1]); // write close
       char r;
       while(read(pipefd[0], &r, 1) > 0)
            printf("Il padre ha ricevuto: %c\n", r);
     } 
     else {  
       // child
       printf("Scrivi un carattere per il figlio: "); 
       char c = getchar();
       close(pipefd[0]); // close read
       write(pipefd[1], &c, 1);
     }
     return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
6 risposte