реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Открыть COM USB в Linux
inventor
сообщение Mar 26 2017, 10:20
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Дело такое: нужно открыть виртуальный 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 -мжет в том проблема
Go to the top of the page
 
+Quote Post
makc
сообщение Mar 26 2017, 11:43
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Почитайте про flock
http://man7.org/linux/man-pages/man2/flock.2.html


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 26 2017, 11:55
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(makc @ Mar 26 2017, 14:43) *


ТС, и не проглядите, что flock ставит advisory lock.


--------------------
Go to the top of the page
 
+Quote Post
Эдди
сообщение Mar 26 2017, 12:59
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает.
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 26 2017, 14:07
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



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

не рутом. юзверем
который в группе dialup
Go to the top of the page
 
+Quote Post
Эдди
сообщение Mar 26 2017, 14:10
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Тогда этого ioctl'а хватит.
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 26 2017, 14:25
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Эдди @ Mar 26 2017, 15:59) *
Для блокировки используйте ioctl(comfd, TIOCEXCL).


какой заголовочник включить, чтобы это работало?
перепробовал десяток!
все разобрался. <asm/ioctls.h>
правда мне всегда казалось что это можно делать
не на уровне пользователя.
Go to the top of the page
 
+Quote Post
Olej
сообщение Mar 27 2017, 20:47
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(inventor @ Mar 26 2017, 17:25) *
правда мне всегда казалось что это можно делать
не на уровне пользователя.

Если казалось 1111493779.gif , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. santa2.gif
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 27 2017, 21:31
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



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

я имел ввиду что мне показалось
что заголовки в папке linus\asm и подобные
можно пользоваться только на уровне драйверов
Go to the top of the page
 
+Quote Post
Olej
сообщение Mar 27 2017, 21:51
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



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

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

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

Go to the top of the page
 
+Quote Post
Эдди
сообщение Mar 28 2017, 05:06
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(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/что-то> - совсем неправильно!

Сообщение отредактировал Эдди - Mar 28 2017, 05:07
Go to the top of the page
 
+Quote Post
krux
сообщение Mar 28 2017, 08:27
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



для обычных программ необходимо пользоваться теми заголовзными файлами ядра, с которыми были собраны библиотеки glibc, ну или что у вас там в качестве общесистемных библиотек используются.
в противном случае вы сами себе сломаете ABI и получите segfault-ы в самых неожиданных местах.


при этом у вас может быть установлено более новое ядро, и его заголовочные будут совсем другими.
а вот модули ядра можно собирать только с заголовочными от нового (актуального) ядра.


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
Эдди
сообщение Mar 28 2017, 10:04
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(krux @ Mar 28 2017, 11:27) *
заголовочными файлами ядра

Где здесь заголовочные файлы ядра? Они нужны лишь при сборке самого ведра и его модулей. К данному случаю это никакого отношения не имеет!
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 28 2017, 12:04
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Эдди @ 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 - это как бы объединяющее
спасибо за подсказку
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 13:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016