2016-09-12 3 views
2

я реализовал драйвер символьного CentOS 7. Драйвер работает нормально, когда она вызывается из программы C, ... константы выглядитдрайвера Linux вызывается с неправильным подсчетом

char bytes[8]; 
int fd = open("/dev/fortuna", O_RDONLY); 
if (fd < 0) { 
    perror("File open error: "); 
    return -1; 
} 
int in = read(fd, bytes, 8); 
if (in < 0) { 
    perror("File read error: "); 
} 
close(fd); 

Драйвер функции чтения вызывается с count = 8, и программа завершается без ошибок. Функция драйвера прототип ...

static ssize_t fortuna_read(struct file *filp, char *buff, size_t count, loff_t *offp); 

Однако, если чтение вызывается из потока C++, как следует ...

char bytes[8]; 
std::ifstream in("/dev/fortuna"); 
if (in.good()) { 
    in.read(bytes, 8); 
} 
in.close(); 

драйвер функция вызывается с кол = 8191. Если драйвер вызывается из Java FileReader, как следует ...

File file = new File("/dev/fortuna"); 
file.setReadOnly(); 
FileReader reader = new FileReader(file); 
char[] cbuf = new char[8]; 
int read = reader.read(cbuf); 
reader.close(); 

драйвер чтения функция вызывается с Count = 8192. функции записи ведут себя аналогичным образом.

Google провалил меня. Помогите?

ответ

2

Это связано с буферизацией. Я уверен, что если вы использовали stdio.h и семейство I/O fopen() вместо open(), вы бы увидели ту же проблему в C.

Таким образом, вы должны отключить буферы. Для C++ есть этот ответ: How to disable buffering on a stream?

+0

Спасибо, сэр. Ваш ответ привел меня к решению Java. – SteveB

1

Благодаря A.B, я также нашел решение Java. FileReader - буферизованный читатель. Правильный Java-класс для использования - FileInputStream.

Смежные вопросы