LINUX.ORG.RU

Сообщения makoven

 

Жизнь структуры, которую требует системная функция

Форум — Development

Здравствуйте.

Неоднократно сталкивался с тем, что функция требует структуру в качестве аргумента. А в мануале не уточняется, понадобится ли переданная структура этой функции в будущем. Как это определять?

В качестве примера написал функцию, кторая устанавливает обработчик на сигнал:

static void set_sig_handler(int sig, void (hnd)(int signum)){
  struct sigaction sa;
  sa.sa_handler = hnd;
  sigemptyset(&sa.sa_mask);
  if(-1 == sigaction(sig, &sa, NULL)) perr_die("set_sig_handler");
}

Тут создается структура sigaction, которая, насколько я понимаю, автоматически исчезает после завершения выполнении функции. Эта структура передается в sigaction и какова ее дальнейшая судьба мне не совсем понятно

 ,

makoven
()

Как подключать локальные пакеты?

Форум — Development

Здравствуйте.

Прочитал мануал, PIL, Stackoverflow, но так и не понял как подключить lua-пакет, лежащий рядом с main.lua

Пример. main.lua:

hello = require("hello")
print(hello)

hello.lua:

return "hello"

Запускаю lua main.lua находясь в директории, где находится main.lua - работает

Перехожу в другую директорию, запускаю lua /home/makoven/main.lua - вылетает с ошибкой «module 'hello' not found»

 

makoven
()

Архитектурно-философский вопрос

Форум — Development

Здравствуйте.

Есть девайс, работающий через последовательный порт. Девайс принимает и отправляет текстовые команды. Каждую секунду девайс опрашивается (отправляем команду получаем ответ).

Изначально все работало на nodejs через ser2net. Сейчас переписываю на Си. Первая мысль была работать с девайсом в отдельном потоке и отдавать команды этому потоку из основного приложения

Но потом внезапно пришла вторая мысль: а почему бы не написать cli-приложение, которому в опциях командной строки передавать команду для девайса. Это приложение откроет tty, отправит команду, выдаст ответ на stdout и благополучно завершится. Затем в основном приложении вызвать popen() этого cli-приложения и читать его stdout. Особая реалтаймовость не требуется

Пожалуйста, покритикуйте вторую мысль и объясните почему я не прав и почему так делать не стоит?

 , ,

makoven
()

Как правильно назначить устройству права пользователя?

Форум — Admin

Здравствуйте.

Есть один usb-serial конвертер, видимый в линуксе как /dev/ttyUSB0. Естественно, при подключении им владеет пользователь root.

Хотелось бы узнать как при помощи systemd грамотно задетектить появление устройства и назначить его владельцем пользователя user.

 ,

makoven
()

Секс с termios

Форум — Development

Здравствуйте.

Есть один ман (man 3 termios). В нем определятеся структура с опциями последовательного интерфейса:

tcflag_t c_iflag; /* input modes */
tcflag_t c_oflag; /* output modes */
tcflag_t c_cflag; /* control modes */
tcflag_t c_lflag; /* local modes */
cc_t c_cc[NCCS]; /* special characters */

Флагов для этих опций там штук сто не меньше.

И есть функция cfmakeraw(), которая:

sets the terminal to something like the «raw» mode of the old Version 7 terminal driver: input is available character by character, echoing is disabled, and all special processing of terminal input and output characters is disabled. The terminal attributes are set as follows:

termios_p−>c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
termios_p−>c_oflag &= ~OPOST;
termios_p−>c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p−>c_cflag &= ~(CSIZE | PARENB);
termios_p−>c_cflag |= CS8;

А волнует меня вот что. Функция cfmakeraw() отключает лишь несколько флагов. А реально флагов намного больше. А вдруг флаги, которые данная функция не отключила, будут влиять на input/output и он таки не будет raw?

Также в одной програме видел вот такое решение:

/* Output options - none = raw */
s_options.c_oflag = 0;

/* Local options - raw input, no clever processing, no echo */
s_options.c_lflag = 0;

Правильно ли так поступать? Нет ли в этом решении каких-то подводных камней

 ,

makoven
()

Как применять пользовательские стили вручную?

Форум — Desktop

Здравствуйте.

Перепробовал GreaseMonkey, Style Manager, Stylish. У них у всех два сценария работы: применить стиль глобально либо применять стиль к конкретным сайтам.

А мне хочется такого сценария: есть список юзерстилей. Они никаким образом ни к чему не применяются автоматически. Находясь на нужной странице выбираем из списка нужый стиль и он применяется только к этой странице.

 ,

makoven
()

zero-byte message block

Форум — Development

Здравствуйте. Читаю я себе man 3p read, и тут внезапно:

In byte-stream mode, read() shall accept data until it has read nbyte bytes, or until there is no more data to read, or until a zero-byte message block is encountered. ...The read() function shall then return the number of bytes read, and place the zero-byte message back on the STREAM to be retrieved by the next read()

Подскажите, что это за zero-byte messsage block? Это сообщение нулевой длины? Как его вообще можно принять? Байт ведь либо есть либо нет.

Или это сообщение с байтом равным нулю?

И вообще зачем это нужно? И так всё сложно донельзя в этих io функциях, а тут еще zero-byte какой-то

 ,

makoven
()

Относительные пути к файлам в шаблоне

Форум — Web-development

Здравствуйте

В корневой директории сайта есть директория «templates». В этой директории лежат html-шаблоны (шаблонизатор mustache). В этой же директории лежат картинки для этих шаблонов.

В браузере через XmlHttpRequest загружаю шаблоны, рендерю их, помещаю на страничку через innerHtml. И тут выясняется неприятная вещь. В шаблонах пути к картинкам заданы относительные

<img src="animated_porn_banner.bmp">
. И только что созданный из шаблона html естественно начинает искать картинки в корневой директории. И не находит..

Подскажите какую-нибудь хитрость, чтобы картинки по относительному имени искались в папке «templates»?

 ,

makoven
()

Сериализация структур. Нет вопроса. Ваши замечания

Форум — Development

Здравствуйте. Собственно, вопросов никаких не имею. Но, возможно, кто-нибудь захочет взглянуть незамутненным взглядом и найдет подводные камни. Или предложит улучшения.

Надоело мне гонять JSON между сервером и клиентом и было решено накостылять свой формат сериализации коллекции структур. Максимально простой в парсинге и восприятии человеком, но со схемой и валидацией.

Сначала идет схема, а следом данные. Данные отделяются между собой ENTER-ами.

Символ "-" означает дефолтное значение поля или пустое значние в схеме. И вот с ним возникает определенная загвоздка. Непонятно что делать, если понадобится интерпретировать его буквально как "-", а не как пустое поле

Формат схемы:

Имя_поля Тип Дефолтное_значение Минимум Максимум

Схема для типа enum

Имя_поля enum Дефолтное_Значение Имя_1 Имя_2 ...

Пример (коллекция из двух человек)

id number - 0 -
name string "John Doe" 1 100
sex enum Male Male Female
hetero boolean true
notes string - 0 500

1
Пертов
-
-
Поддержка\n\t escape-последовательностей

2
Иванова
Female
false
-

 

makoven
()

Wi-fi пульт.

Форум — Linux-hardware

Здравствуйте. Размышлял я недавно об управлении устройствами с телефона и пришел к выводу, что это жуть как неудобно. Скажем, чтобы включить свет, мне понадобится разблокировать, запустить wi-fi (для особо экономных), запустить приложение, подождать пока но подключится и только потом нажимать заветную кнопку.

Пришла в голову мысль, что неплохо бы для этих целей подощел wi-fi ПДУ. Функции его очень просты - на каждую кнопку назначаем GET/POST запрос на нужный нам url. При нажатии на кнопку пульт просыпается и отправляет запрос. Всю остальную работу делает web-сервер или непосредственно девайс/сервис с REST-управлением

Если еще немного пофантазировать, можно добавить telnet/SSH/SMTP - протоколы и светодиод, загорающийся разным цветом в зависимости от успеха/ошибки

Подскажите, может быть уже есть в природе подобное. Или может есть какая-нибудь платка с Wi-fi и микроконтроллером, которая позволит сделать самому с минимумом пайки?

 

makoven
()

thttpd не реагирует на Ctrl_C из баш-скрипта

Форум — Desktop

Подскажите, из-за чего такое может быть? Если вызываю это из командной строки, то по Ctrl_C он благополучно завершается

thttpd -D -p 8888
(-D означает не форкать, -p - порт)

Помещаю эту строку в файл, запускаю, жму Ctrl_C - на экране появляется ^C и перенос строки. И так до бесконечности

 

makoven
()

Шок от С. Как склеивать строки?

Форум — Development

Осваиваю си. Всё шло хорошо пока внезапно не понадобилось склеить строки (константные и переменные). Покурил stackoverflow. Предлагают 2 варианта:

Первый - создать char buf[молись_чтобы_хватило] и делать str(n)cat/sprintf в этот buf.

Второй - использовать asprintf, который расширение, нестандарт и вообще.

Вопрос: как вы склеиваете строки? Может есть какая-нибудь общепринятая либа?

Простите за нубский вопрос

 

makoven
()

Линковка c89 библиотеке к c11 коду

Форум — Development

Здравствуйте.

Если библиотека на писана на одной версии C а код - на другой? При статической и динамической линковке. Будет ли оно наботать?

Читал, что код может не работать, если библиотеки скомпилированы с отличающимися опциями, связаными с выравниванием. Какие еще опции могут поломать совместимость?

 

makoven
()

Йо, дог, я слышал ты любишь компьютеры

Галерея — Рабочие места

Открытый корпус - отличное украшение для стола. Когда скучно, можно рассматривать провода и наблюдать за вращением кулеров. А если у вас шизофрения, то можно скоротать долгие часы выясняя куда ведет каждая дорожка на материнской плате

В системнике справа на универсальном изоляторе типа «линолеум» разместилась cubieboard2. Питается она от БП системника и прекрасно работает когда он выключен. По советам местных электронщиков соединил земли кубиборды и корпуса. Так что если что-то взорвется - это вы виноваты.

Тип крепления линолеума к корпусу - двусторонний скотч. Кубиборды к линолеуму - коричневая жила из витой пары. Два SSD тоже склеены бутербродиком двусторонним скотчем.

Красный USB провод заряжает Cobra Libre. Это не мой, конечно же. Это кто-то случайно оставил у меня на столе

makoven
()

Когда на обоих концах динамический IP

Форум — Admin

Здравствуйте. Не знаю как правильно называется, поэтому приведу пример.

Есть openwrt-роутер. Он находится в торговом центре, в котором интернет, естественно, всячески закрыт и открыть порт во внешний мир не представляется возможным. Роутер подключен к этому интернету как локальный девайс, т.е берет адрес по DHCP как все другие устройства.

Хочется иметь доступ к веб-интерфейсу этого роутера с телефона. Пришло в голову такое решение: на телефон поставить DDNS-клиент с адресом example.com и повесить на порт 8080 некую програму. А роутер заставить непрерывно стучаться на example.com:8080

Когда телефон подключен к интернету, роутер успешно подключается к телефону, создает некий тоннель. После чего я могу зайти на его веб-интерфейс, допустим, по адресу 127.0.0.1:80.

Вопрос: как называется, то что я описал? И есть ли на свете таке ПО, что поможет осуществить мне задуманное?

 

makoven
()

Утилита для пинга списка ip-адресов?

Форум — Admin

Подскажите, утилиту. Запускешь ее, она пингует заданный список ip-адресов и выводит табличку - кто жив, кто мертв. Или что-то близкое к этому описанию.

makoven
()

Архитектура C для чайников

Форум — Development

Здравствуйте.

Прошу людей, близких к миру C, посоветовать, поправить мои (скудные) представления о том, как должна выглядеть модульная система на C.

Пусть это будет кофеварка и лампа, управляемые через браузер. Кофеварка подключена к компьютеру через COM-порт. А лампа - через TCP. И есть, собственно, пользователь, отдающий команды через браузер по websockets.

Итого имеем как минимум 4 процесса - драйвер кофеварки, драйвер лампы, обработчик websockets-подключения. И основной процесс, координирующий действия первых трех. Назовем его Менеджер.

Я представляю себе это таким образом: менеджер - исполняемый файл. А три других модуля - динамические библиотеки. Менеджер загружает модули и вызывает в них некую функцию «start», которая форкает модуль и он приступает к управлению устройством.

И здесь у меня вопрос: насколько приемлимо использовать libuv в Менеджере? Я читал, что всё, что связано с процесами - чрезвычайно непереносимо. И что мультизадачность очень сложна и лучше ее всячески избегать.

Как обмениваться информацией между процессами? Можно ли обойтись трубами или придется использовать какой-нибудь nanomsg/0mq?

Можно ли передавать между процессами структуры прямо из памяти или придется сериализовать/десериализовать? Как вообще обычно передают сообщения между процессами?

Или всё тут написаное полная хрень и лучше делать по-другому?

makoven
()

Пробросить com-порт из линукса в винду

Форум — Admin

Есть один компьютер с archlinux. На нем запущена виртуалка с windows 7 с помощью qemu-kvm. К компьютеру подключен переходник USB-to-serial, который виден в линуксе как /dev/ttyUSB0.

Пытался пробросить его c помощью

 -usbdevice host:xxxx:yyyy 
. Венда вываливается в синий экран.

Пытаюсь пробросить непосредственно tty устройство как с помощью

-serial /dev/ttyUSB0 
так и через
-chardev serial,id=tty1,path=/dev/ttyUSB0
. Устройство из венды не читается. Параметры tty на хосте и госте выставлены одинаково.

Что я не так делаю? Может у кого-нибудь получалось успешно пробросить com-порт?

 

makoven
()

Засунуть кубиборду в работающий системник

Форум — Linux-hardware

Когда трогаю металлические части системника, ощущаются вибрации и покалывания. Где-то читал, что БП выводит -110 вольт на корпус (или что-то в этом роде)

Вопрос: если прикручу внутрь корпуса кубиборду и запитаю ее от от отдельного адаптера - ей станет плохо от этих 110 вольт?

makoven
()

Есть ли под линукс софт для ведения видеоархива из ip-камер?

Форум — Admin

Хочу себе домой видеоархив. На трасиры с макроскопами денег. Где бы найти програмку, которая пишет h.264+AAC на диск (кусками по n минут) и подчищает старые записи когда место кончается. Остальные функции не критичны.

makoven
()

RSS подписка на новые темы