I am trying to read from a nbd device with function read()
Here is the code:
static uint64_t hash_log_free_list; int fd = open(argv[2], O_RDWR|O_LARGEFILE); assert(fd != -1); int err = read(fd, &hash_log_free_list, sizeof(uint64_t)); if (err != sizeof(uint64_t)) { MSGDEBUG perror("read"); printf("err: %dn", err); abort(); }
argv[2] is a nbd device: /dev/nbd0
MSGDEBUG is defined to print __FILE__, __LINE__ and __FUNCTION__
and I got the error msg:
Error!!! dedup.c: 554: main read: Invalid argument err: 0 Aborted
Am I doing something wrong?
Advertisement
Answer
read
returns 0 which is not an error, it just tells you that there’s nothing to read.
You can use select
/epoll
before calling read
to make sure there’s actual data to read.
Also, remove the MSGDEBUG
line because it’s printing stuff and most probably changing errno
at the same time, so your perror
probably gives you information about what happend in MSGDEBUG
, not in the read
before it.