Хотя у меня нет под рукой системы MINIX, я уверен, что проблема в том, что "режим" не имеет отдельных битов для различных типов файлов. Вам следует использовать макросы типа S_ISDIR
, а не сравнивать с S_IFDIR
(S
, а не F
). Вот библиотека GNU C.
Вот старые версии с машины linux. Ведущие 0
означают, что эти значения в восьмеричном исчислении.
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#define S_IFMT 00170000
#define S_IFSOCK 0140000
#define S_IFLNK 0120000
#define S_IFREG 0100000
#define S_IFBLK 0060000
#define S_IFDIR 0040000
#define S_IFCHR 0020000
и т.д. Итак, ваш код проверяет, является ли (mode & 0120000) ненулевым, и это будет так, если установлен либо 0100000, либо 020000 бит, что будет так для S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK и S_IFCHR. Ваш pts будет иметь тип S_IFCHR.
Вы хотите преобразовать температуру, считанную как десятичное значение, в символ, соответствующий шестнадцатеричному значению, которое при отображении читается так же, как температура...
Запрос кажется более сложным, чем он есть на самом деле; printf
можно использовать для печати символа, соответствующего заданному коду символа:
$ printf "\x64\n"
d
Таким образом, вы получите нужный результат с помощью
printf "\x$(cut -c1-2 < /sys/class/hwmon/hwmon0/temp2_input)" | dd of=/dev/port bs=1 count=1 seek=128