Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [C]Pipe

  1. #1

    [C]Pipe

    Cos'ha di inesatto questo programmino??

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define N_FIGLI 2
    int n=0;
    
    void pari(int ppari[]){
        int buffer;
        //printf("Entro nella funzione pari\n");
        while(n>=0){
    	read(ppari[0],&buffer,sizeof(buffer));
    	printf("Il figlio pari ha letto : %d",buffer);
        }
        exit(1);
    }
    
    void dispari(int pdispari[]){
        int buffer;
    //printf("Entro nella funzione dispari\n");
        while(n>=0){
    
    	read(pdispari[0],&buffer,sizeof(buffer));
    	printf("Il figlio dispari ha letto : %d",buffer);
        }
        exit(2);
    }
    int main(){
    
    int buffer,ppari[2],pdispari[2],pid=10,i,status,m=0;
    if(pipe(ppari)==-1) {printf("Errore nella creazione della pipe");exit(1);}
    if(pipe(pdispari)==-1){printf("Errore nella creazione della pipe");exit(1);}
    
    for(i=0;i<N_FIGLI;i++){
    
    if(pid>0){
    pid=fork();
    //printf("Pid = %d && i=%d\n",pid,i);
    if(pid==0 && i==0){
    pari(ppari);
    }else if(pid==0 && i==1){
    dispari(pdispari);
    }
    }
    }//for
    
    if(pid>0){
    while(n>=0){
    
        printf("Inserisci un valore : ");
        scanf("%d",&n);
        if((n%2)==0) {write(ppari[1],&n,sizeof(n));}
        else write(pdispari[1],&n,sizeof(n));
    }
    kill(pid,1);
    kill((pid-1),1);
    wait(&status);
    }
    return 1;
    }
    C'è un processo padre che legge dei valori da input e a seconda se sono pari o dispari li manda alla pipe dei pari o alla pipe dei dispari.
    Il problema è che le due pipe di lettura non ricevono nulla
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  2. #2
    Utente di HTML.it L'avatar di Grunt
    Registrato dal
    Dec 2001
    Messaggi
    246
    Ma se metti il fork all'interno del for ottieni solo di creare 4 processi!!! Si incasina tutto.....
    Tra le altre cose... non aspetti che i figli muoiano e soprattutto non li fai morire.
    Per intenderci alla fine del
    codice:
    pid==0
    devi mettere un _exit(); altrimenti il figlio non muore!!!! Cmq guardati un po' meglio la creazione di processi e la loro gestione..... poi magari passi alle pipe!!!!

  3. #3
    Non ottengo 4 processi , ma solo 2.In effetti non attendo che muoiano solo se muore inaspettatamente il padre, altrimenti si killano tutti i figli e il padre aspetta la loro morte.
    Cmq
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  4. #4
    In ogni processo devi chiudere il flusso "opposto" della pipe:

    codice:
    void pari(int ppari[]){
        close( ppari[ 1 ] );
    codice:
    void dispari(int pdispari[]){
        close( pdispari[ 1 ] );
    codice:
    if(pipe(ppari)==-1) {printf("Errore nella creazione della pipe");exit(1);}
    if(pipe(pdispari)==-1){printf("Errore nella creazione della pipe");exit(1);}
    close( ppari[ 0 ] );
    close( pdispari[ 0 ] );
    Ora non ho visto bene il resto, ma ti ricordo, osservando la variabile globale 'n', che le variabili globali non sono condivise fra i processi.

  5. #5
    Doppio post Cmq il codice l'ho modificato , la variabile globale è sparita
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  6. #6
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    Scusate non ho mai sentito parlare di pipe,fork,kill cosa sono?

  7. #7
    Sono delle SystemCall di Linux che permettono :
    pipe - Sono dei canali di comunicazione tra i processi , e tipermettono di scambiare messaggi tra uno o più processi.
    fork - Duplica il processo che o chiama in un nuovo processo figlio , identico al padre.
    kill - E' un comando che uccide un processo .
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  8. #8
    Sono delle SystemCall di Linux che permettono
    Sono chiamate POSIX, non esiste solo Linux al mondo.

  9. #9
    :gren: :gren: Non te la prendere ... è l'abitudine

    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  10. #10
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    Cioè cosa sono le SystemCall o POSIX
    sono un newbye scusate
    CIao

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.