Domanda

sto leggendo / scrittura dei dati off di una named pipe. Sul lato di scrittura si dice che sta scrivendo una costante di 110 byte. Sul lato di lettura per la maggior parte del tempo si dice che è la lettura di 110 byte che è corretto, ma altre volte si dice la sua lettura di 220 byte o 330 byte. Che è proprio nel fatto che quando lo stampo fuori è stampare lo stesso messaggio due o tre volte di fila nello stesso read (). Nel codice di seguito per la lettura sto facendo qualcosa di sbagliato con il memset per cancellare il carattere? Non riesco a pensare a nessun altro modo in cui è la lettura più allora viene scritto a meno che qualcosa è rimasto nel buffer.

int fd1, numread;
char bufpipe[5000];

    while(1)
    {
        fd1 = open("/tmp/testPipe", O_RDONLY);
        numread = read(fd1,bufpipe, 5000);//->this should always be 110
        if(numread > 1)
        {
            printf("READ: %i", numread); 
            bufpipe[numread+1] = '\0';
            memset(bufpipe,'\0',5001);
            close(fd1);
        }
    }
È stato utile?

Soluzione

Questa:

memset(bufpipe,'\0',5001);

sovrascrive da un byte, perché hai solo 5000 byte.

Ma il principale "problema" è che read(..., 5000) sarà sempre leggere tanto quanto può fino a 5000 byte - ti sembra di essere supponendo che leggerà solo quel tanto che è stato scritto in una sola volta dallo scrittore, che non è vero. Se lo scrittore scrive due pacchetti di 110 byte tra due letture, allora è del tutto corretto che il lettore legge 220 byte.

Se avete bisogno di leggere un solo pacchetto alla volta, devi fare i pacchetti autodescrittivi. Così, per esempio, i primi quattro byte contengono il numero di byte da seguire. Poi si può leggere un singolo pacchetto leggendo quattro byte, che converte in un numero intero, quindi leggere il numero di byte di dati.

Altri suggerimenti

La tua ipotesi che un read eseguirà subito dopo un write non è vero. Il processo di scrittore potrebbe scrivere al tubo un paio di volte prima che si incontra una lettura. i dati scritti saranno aggiunti alla fine del buffer. In altri termini, leggere e scrivere non sono orientati Packet. Sono orientato al flusso. Ciò significa che <=> aggiunge solo dati al buffer e <=> ottiene appena nulla a sua disposizione.

Come si esegue la sincronizzazione con lo scrittore? Hai bisogno di leggere solo ciò che vi aspettate (specificare 110 per leggere ())

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top