Domanda

Sto avendo problemi di debug perché n_bytes in funzione read_from_fifo in client.c non corrisponde al valore scritto al FIFO. Dovrebbe scrivere solo 25 byte, ma si cerca di leggere molto di più (1836020505 bytes (!) Per l'esattezza). Qualsiasi idea del perché questo sta accadendo?

server.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>
#include <sys/stat.h>

typedef enum { false, true } bool;

//first read the int with the number of bytes the data will have
//then read that number of bytes
bool read_from_fifo(int fd, char* var)
{
    int n_bytes;
    if (read(fd, &n_bytes, sizeof(int)))
    {
        printf("going to read %d bytes\n", n_bytes);
        if (read(fd, var, n_bytes))
            printf("read var\n");
        else {
            printf("error in read var. errno: %d\n", errno);
            exit(-1);
        }
    }

    return true;
}

int main()
{
    mkfifo("/tmp/foo", 0660);
    int fd = open("/tmp/foo", O_RDONLY);
    char var[100];
    read_from_fifo(fd, var);
    printf("var: %s\n", var);
    return 0;
}

client.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

typedef enum { false, true } bool;

//first write to fd a int with the number of bytes that will be written afterwards
bool write_to_fifo(int fd, char* data)
{
    int n_bytes = (strlen(data)) * sizeof(char);
    printf("going to write %d bytes\n", n_bytes);
    if (write(fd, &n_bytes, sizeof(int) != -1))
        if (write(fd, data, n_bytes) != -1)
            return true;
    return false;
}


int main()
{
    int fd = open("/tmp/foo", O_WRONLY);
    char data[] = "some random string abcdef";
    write_to_fifo(fd, data);
    return 0;
}

Aiuto è molto apprezzato. Grazie in anticipo.

È stato utile?

Soluzione 3

Ho trovato la soluzione io stesso.

Il problema è un ')' che ci crediate o no. La variabile n_bytes è corretta, il problema è che non sto scrivendo che al FIFO.

questo (write(fd, &n_bytes, sizeof(int) != -1))

dovrebbe essere questo (write(fd, &n_bytes, sizeof(int)) != -1)

Grazie comunque per le vostre risposte.

Altri suggerimenti

Il valore restituito per un errore dal read(2) è -1, non 0. Quindi, se il vostro estratto conto per i primi 4 byte leggere, almeno, è sbagliato.

Hai Controllare se nbytes stampati dalla funzione read_from_fifo () visualizzato il valore corretto? avviso Solo che il write (fd, dati, n_bytes) non hai scritto alla fine della stringa di char '\ 0', e ogni volta che lo si legge da lettura (fd, Var, n_bytes), non hai aggiunto un '\ 0' alla fine della stringa appena letto, in modo che il printf ( "var:% s \ n", var); potrebbe visualizzare una stringa non \ 0 conclusa con conseguente risultati imprevisti.

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