Курить маны, говорите?
Mar. 14th, 2017 11:47 amПытаясь скрестить all-sky с болтвудом столкнулся с проблемой: у обоих RS-485 через FTDI идет, т.е. VID/PID одинаковый, и хитрый симлинк udev'ом не сделать (ну или просто через libusb+udev можно было бы в программке сразу нужный девайс искать). И вот оказалось, что если демон, работающий с all-sky, уже запущен, то в случае если кто-то что-то в порт напишет, то происходит зависон (т.к. нужно реинициализировать устройство, охреневшее от неожиданных данных).
Сразу подумал, что можно было бы открывать порт, блокируя его. Убрал из open() O_NONBLOCK, и — фигвам! Этот флаг не отвечает за блокировку устройства, а лишь блокирует процесс, пока устройство не будет готово.
Ну и как, интересно, мне открыть порт так, чтобы никто больше его не мог открыть?
UPD: надо было сразу гуглить "lock serial port", ioctl с флагом TIOCEXCL должен помочь (отсюда).
UPD-2: TIOCEXCL не защищает от повторного открытия порта рутом! Т.е. для обеспечения надежности таки демоны надо из-под рута запускать.
Сразу подумал, что можно было бы открывать порт, блокируя его. Убрал из open() O_NONBLOCK, и — фигвам! Этот флаг не отвечает за блокировку устройства, а лишь блокирует процесс, пока устройство не будет готово.
Ну и как, интересно, мне открыть порт так, чтобы никто больше его не мог открыть?
UPD: надо было сразу гуглить "lock serial port", ioctl с флагом TIOCEXCL должен помочь (отсюда).
UPD-2: TIOCEXCL не защищает от повторного открытия порта рутом! Т.е. для обеспечения надежности таки демоны надо из-под рута запускать.