Вам нужно передать целое число во втором параметре open
, в вашем случае это O_RDWR
. Вызов должен быть:
fd = open ("/dev/chardev", O_RDWR);
Прочтите руководство: man 2 open
. Ссылка: http://linux.die.net/man/2/open
UPDATE
Вы неправильно проверяете наличие ошибок чтения. Ваш код:
read(fd, receive_buff, RSIZE);
err_save = errno;
if (fd < 0)
{
perror("read perror");
printf("error reading device, fd = %d, err_save = %d \n", fd,err_save);
}
В случае ошибки чтения read
вызов вернет -1
, поэтому вы должны проверить возвращаемое значение read
, а не fd
. Сделай это:
read_bytes = read(fd, receive_buff, RSIZE);
err_save = errno;
if (read_bytes < 0)
{
perror("read perror");
printf("error reading device, fd = %d, err_save = %d \n", fd,err_save);
}
Ваш код работает правильно, потому что второй параметр - это просто целое число с установленными значениями битов, которое имеет определенную интерпретацию. Вы передаете адрес (базовый адрес строки в загруженном исполняемом файле), который также является целым числом и имеет определенные определенные поля, установленные и некоторые неустановленные. Невозможно сказать, что, если биты были установлены правильно ИЛИ флагами или были случайным целым числом, в котором, как оказалось, установлены конкретные биты. Поэтому функция будет интерпретировать случайное целое число, проверяя, какой бит установлен или нет, и работает в соответствии с интерпретацией, назначенной для каждого бита.
Также при чтении из файла вы не проверяете, было ли чтение успешным. Если случайное целое число имеет правильные биты для чтения набора файлов, оно будет считываться правильно.