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

Discussione: [C] Uso di pipe in C

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    261

    uso di Pipe() in C

    vi riporto il codice ....non capisco perchè quando voglio far leggere al padre quello che scrive il figlio si blocca in esecuzione ...........perchè?!

    #include <sys/types.h>
    #include <stdio.h>
    #include <sys/wait.h>
    #include <stdlib.h>
    main()
    {
    int c;
    int j=6;
    int pid;
    int status;
    int piped[2];
    /* genera primo figlio*/
    pipe(piped);
    pid=fork();



    if (!pid)
    {printf("\n");
    printf("Sono il filgio:PID=%d PPID=%d ",getpid(),getppid());
    read(piped[0],&c,sizeof(int));

    printf("leggo %d\n",c);

    write(piped[1],8,sizeof(int)); esattamente qui
    printf("sono il figlio ho scritto %d");
    exit(0);
    }

    else
    {printf("\n");
    write(piped[1],&j,sizeof(int));
    printf("sono il padre e ho scritto %d\n",j);

    read(piped[0],&c,sizeof(int)); esattamente qui
    printf("sono il padre e leggo %d\n",c);

    pid=wait(&status);

    printf("figlio terminato:PID=%d Stato=%d\n",pid,status);
    printf("programma terminato");





    getchar();

    }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    261
    forse sono stato poco (o per niente ) chiaro......comunque il senso è questo:

    come potete vedere il padre prima legge....e li tutto ok !!! ma nel momento in cui scrive rimane bloccato come se aspettasse input dal figlio.!!!!

  3. #3
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    se non ricordo male le pipe sono canali monodirezionali... un processo non può leggere e scrivere contemporaneamente sulla stessa pipe... è per questo che ogni processo dovrebbe chiudere l'estremo della pipe che non usa.

    Per il tuo problema devi usare due pipe e per ognuna chiudere gli estremi non usati.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    261
    si infatti hai ragione ...pero io sapevo che esiste la funzione dup() per resettare la pipe pero non funiona!!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    261

    linguaggio C close(pipe[0])

    su alcune dispense del mio prof c'è scritto che close serve a chiudere la pipe .....ma in che senso cioè che dopo il close() non posso ne più leggere che scrivere nela stessa pipe

  6. #6
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    forse è il caso che ripassi la teoria... dup() non serve a resettare proprio nulla, serve a duplicare un file descriptor. E' spesso usato per redirezionare una pipe su stdin o stdout.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    261
    comunque che strano ho usato due pipe è andato tutto ok!

    poi ho rimesso di nuovo una solo pipe e lo stesso esercizio funziona lo stesso......... mha sto C certe volte non la capisco!!!!!!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303

    Moderazione

    Ho unito l'altra discussione che hai aperto... non ho capito perchè ne hai aperta un'altra visto che l'argomento è lo stesso.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303

    Re: linguaggio C close(pipe[0])

    Originariamente inviato da aspire1982
    su alcune dispense del mio prof c'è scritto che close serve a chiudere la pipe .....ma in che senso cioè che dopo il close() non posso ne più leggere che scrivere nela stessa pipe
    close() è una system call che serve a chiudere un file.
    In Unix/Linux tante cose possono essere viste come un file (e tra queste ci sono sicuramente le pipe).

    Con l'istruzione close(pipe[0]) non chiudi l'intero pipe, ma solo il canale di input (o di output, ora non ricordo). Va fatto perchè i PIPE sono canali monodirezionali usati da due processi, quindi uno dei due canali va chiuso da un processo e l'altro va chiuso dal secondo processo.

    Schematizzando:

    A --> B

    Il processo A scrive sul pipe, mentre il processo B legge dal pipe.

    Il processo A chiude il canale di input, mentre il processo B chiude quello di output.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    261
    ma nel caso in cui non chiudo i canali che succede!!!!?posso continuare a scrivere....o a leggere sulla stessa pipe?

    poi per monodirezonale che si intende ?
    cioè chi comincia a scrivere che sia padre o figlio puo solo scrivere?non puo leggere sulla stessa pipe?

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.