Перейти к содержанию
    

Открыть COM USB в Linux

Дело такое: нужно открыть виртуальный COM порт в Linux так, чтобы любой

другой процесс / поток/задача не мог получить возможность писать-читать из этого порта пока он занят.

То есть при попытке открытия занятого порта - выдавалась ошибка BUSY что то подобное

 

	/* Открываем порт */
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 -мжет в том проблема

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почитайте про flock

http://man7.org/linux/man-pages/man2/flock.2.html

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает.

не рутом. юзверем

который в группе dialup

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для блокировки используйте ioctl(comfd, TIOCEXCL).

 

какой заголовочник включить, чтобы это работало?

перепробовал десяток!

все разобрался. <asm/ioctls.h>

правда мне всегда казалось что это можно делать

не на уровне пользователя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

правда мне всегда казалось что это можно делать

не на уровне пользователя.

Если казалось :1111493779: , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. :santa2:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если казалось :1111493779: , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. :santa2:

я имел ввиду что мне показалось

что заголовки в папке linus\asm и подобные

можно пользоваться только на уровне драйверов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я имел ввиду что мне показалось

что заголовки в папке linus\asm и подобные

можно пользоваться только на уровне драйверов

Когда кажется - перекреститься нужно!

А заголовочные файлы ядра и (часто подобные им) заголовочные файлы пространства пользователя - лежат в совершенно разных местах.

В модулях ядра (то что вы называете драйверами) могут использоваться только и исключительно заголовочные файлы ядра, вот отсюда:

$ ls /lib/modules/`uname -r`/build/include
...

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Эдди

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

в противном случае вы сами себе сломаете ABI и получите segfault-ы в самых неожиданных местах.

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

заголовочными файлами ядра

Где здесь заголовочные файлы ядра? Они нужны лишь при сборке самого ведра и его модулей. К данному случаю это никакого отношения не имеет!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничуть не разобрался! Вдумчиво читать:

/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 - это как бы объединяющее

спасибо за подсказку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...