Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Открыть COM USB в Linux
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
inventor
Дело такое: нужно открыть виртуальный COM порт в Linux так, чтобы любой
другой процесс / поток/задача не мог получить возможность писать-читать из этого порта пока он занят.
То есть при попытке открытия занятого порта - выдавалась ошибка BUSY что то подобное

CODE
/* Открываем порт */
com_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
if (com_fd < 0) {
perror("open");
break;
}
printf("INFO: port open OK\n");

tcgetattr(com_fd, &oldtio); /* сохранение текущих установок порта */
bzero(&newtio, sizeof(newtio));

/* Неканонический режим. Нет эхо. 8N2 */
newtio.c_cflag |= (CLOCAL | CREAD);

то есть какие флаги нужно поставить, чтобы при попывтке открыть уже
открытый порт выдавалась ошибка.

PS проверяю на виртуалке VirtualBox -мжет в том проблема
makc
Почитайте про flock
http://man7.org/linux/man-pages/man2/flock.2.html
des333
Цитата(makc @ Mar 26 2017, 14:43) *


ТС, и не проглядите, что flock ставит advisory lock.
Эдди
Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает.
inventor
Цитата(Эдди @ Mar 26 2017, 15:59) *
Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает.

не рутом. юзверем
который в группе dialup
Эдди
Тогда этого ioctl'а хватит.
inventor
Цитата(Эдди @ Mar 26 2017, 15:59) *
Для блокировки используйте ioctl(comfd, TIOCEXCL).


какой заголовочник включить, чтобы это работало?
перепробовал десяток!
все разобрался. <asm/ioctls.h>
правда мне всегда казалось что это можно делать
не на уровне пользователя.
Olej
Цитата(inventor @ Mar 26 2017, 17:25) *
правда мне всегда казалось что это можно делать
не на уровне пользователя.

Если казалось 1111493779.gif , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. santa2.gif
inventor
Цитата(Olej @ Mar 27 2017, 23:47) *
Если казалось 1111493779.gif , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. santa2.gif

я имел ввиду что мне показалось
что заголовки в папке linus\asm и подобные
можно пользоваться только на уровне драйверов
Olej
Цитата(inventor @ Mar 28 2017, 00:31) *
я имел ввиду что мне показалось
что заголовки в папке linus\asm и подобные
можно пользоваться только на уровне драйверов

Когда кажется - перекреститься нужно!
А заголовочные файлы ядра и (часто подобные им) заголовочные файлы пространства пользователя - лежат в совершенно разных местах.
В модулях ядра (то что вы называете драйверами) могут использоваться только и исключительно заголовочные файлы ядра, вот отсюда:
Код
$ ls /lib/modules/`uname -r`/build/include
...

Которые не имеют ничего общего с заголовочными файлами пользовательского пространства из /usr/include.

Эдди
Цитата(inventor @ Mar 26 2017, 17:25) *
все разобрался. <asm/ioctls.h>

Ничуть не разобрался! Вдумчиво читать:
Код
/usr/include/bits/ioctls.h:# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead."

Кстати, у меня сам TIOCEXCL лежит в /usr/include/asm-generic/ioctls.h, но в коде я явного #include <sys/ioctl.h> не вижу — видимо, что-то другое его инклюдит.
Но в любом случае: #include <sys/что-то> - правильно, а вот #include <asm/что-то> - совсем неправильно!
krux
для обычных программ необходимо пользоваться теми заголовзными файлами ядра, с которыми были собраны библиотеки glibc, ну или что у вас там в качестве общесистемных библиотек используются.
в противном случае вы сами себе сломаете ABI и получите segfault-ы в самых неожиданных местах.


при этом у вас может быть установлено более новое ядро, и его заголовочные будут совсем другими.
а вот модули ядра можно собирать только с заголовочными от нового (актуального) ядра.
Эдди
Цитата(krux @ Mar 28 2017, 11:27) *
заголовочными файлами ядра

Где здесь заголовочные файлы ядра? Они нужны лишь при сборке самого ведра и его модулей. К данному случаю это никакого отношения не имеет!
inventor
Цитата(Эдди @ Mar 28 2017, 08:06) *
Ничуть не разобрался! Вдумчиво читать:
Код
/usr/include/bits/ioctls.h:# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead."

Кстати, у меня сам TIOCEXCL лежит в /usr/include/asm-generic/ioctls.h, но в коде я явного #include <sys/ioctl.h> не вижу — видимо, что-то другое его инклюдит.
Но в любом случае: #include <sys/что-то> - правильно, а вот #include <asm/что-то> - совсем неправильно!

у меня работает и с asm/ioctls.h и с sys/ioctl.h
включил последнее, мне не нравятся названия с asm
потому что на разных машинах и рахзных процах
внутренности могут быть разные
a sys - это как бы объединяющее
спасибо за подсказку
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.