inventor 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Дело такое: нужно открыть виртуальный 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 -мжет в том проблема Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 185 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Почитайте про flock http://man7.org/linux/man-pages/man2/flock.2.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Почитайте про flock http://man7.org/linux/man-pages/man2/flock.2.html ТС, и не проглядите, что flock ставит advisory lock. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает. не рутом. юзверем который в группе dialup Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Тогда этого ioctl'а хватит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Для блокировки используйте ioctl(comfd, TIOCEXCL). какой заголовочник включить, чтобы это работало? перепробовал десяток! все разобрался. <asm/ioctls.h> правда мне всегда казалось что это можно делать не на уровне пользователя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба правда мне всегда казалось что это можно делать не на уровне пользователя. Если казалось :1111493779: , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. :santa2: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Если казалось :1111493779: , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. :santa2: я имел ввиду что мне показалось что заголовки в папке linus\asm и подобные можно пользоваться только на уровне драйверов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба я имел ввиду что мне показалось что заголовки в папке linus\asm и подобные можно пользоваться только на уровне драйверов Когда кажется - перекреститься нужно! А заголовочные файлы ядра и (часто подобные им) заголовочные файлы пространства пользователя - лежат в совершенно разных местах. В модулях ядра (то что вы называете драйверами) могут использоваться только и исключительно заголовочные файлы ядра, вот отсюда: $ ls /lib/modules/`uname -r`/build/include ... Которые не имеют ничего общего с заголовочными файлами пользовательского пространства из /usr/include. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 28 марта, 2017 Опубликовано 28 марта, 2017 (изменено) · Жалоба все разобрался. <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/что-то> - совсем неправильно! Изменено 28 марта, 2017 пользователем Эдди Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба для обычных программ необходимо пользоваться теми заголовзными файлами ядра, с которыми были собраны библиотеки glibc, ну или что у вас там в качестве общесистемных библиотек используются. в противном случае вы сами себе сломаете ABI и получите segfault-ы в самых неожиданных местах. при этом у вас может быть установлено более новое ядро, и его заголовочные будут совсем другими. а вот модули ядра можно собирать только с заголовочными от нового (актуального) ядра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба заголовочными файлами ядра Где здесь заголовочные файлы ядра? Они нужны лишь при сборке самого ведра и его модулей. К данному случаю это никакого отношения не имеет! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба Ничуть не разобрался! Вдумчиво читать: /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 - это как бы объединяющее спасибо за подсказку Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться