Поступило от заказчика задание: нужно доработать программу АРМа. Смысл доработки: по COM-порту поступает сообщение (4 байта, один из них -- код ошибки), получив которое нужно на экран вывести окно с информацией об ошибке.
Если бы АРМ был иксовый, я бы просто написал ещё одну программу, но во время разработки мы до иксов ещё не дошли, АРМ работает на Debian 4 и графика -- на svgalib. То есть пришлось дорабатывать и АРМ. Доработал. И написал довольно простую программу, которая принимает сообщение и записывает код в разделяемую память. А АРМ, обнаружив этот код, рисует дополнительное окно. Сброс -- по Escape.
Отправил им программы АРМа и proj_fka. Сказали, что fka не запускается -- нет библиотеки (собирал под Debian 7). Собрал с -static -- сказали всё работает. АРМ собрать с -static не удалось. Но он заработал (почти) без проблем.
Теперь об основной проблеме.
Сегодня позвонили: "Сообщения не показываются. Хотя раньше показывались". Приехал. Стал разбираться. Запускаю в режиме консоли -- не виду, чтобы по COM порту что-то приходило. Говорят, что ДОЛЖНО. Проверяю через dd if=/dev/tttyS0 bs=1 -- тоже ничего не вижу. Потом, вдруг, слышу: "У нас через этот порт подключены джойстик и клавиатура. Всё работает". И тут до меня доходит.
Выдаю pgrep -lf fk и вижу ещё два процесса rmo_fk. Говорят: "Это наша программа". Захожу в /proc/uid/fd и вижу
@3 -> /dev/ttyS0
То есть их программа открыла этот же COM порт и вся информация с него идёт ей.
Даю skill rmo_fk, запускаю свою программу -- всё "работает" (почти, в программе допустил одну маленькую ошибку, которую не мог найти, возясь по несколько часов в течение двух дней, сообразил, когда ждал троллейбус).
Но в моей программе
Код: Выделить всё
char *dev="/dev/ttyS0";
if(!(f=fopen(dev,"r")))
error(1,errno,"Error open file \"%s\"",dev);
Поэтому и возник вопрос Если ли средства, позволяющие обнаружить, что файл уже открыт и сообщить об этом?
Этот вопрос на будущее. В данном случае сказал, что единственный вариант -- встраивать мой код в свою программу.