LINUX.ORG.RU

Сообщения velikS

 

Можно ли с select() отслеживать, что в файле появились новые данные?

Всем привет,

Что-то торможу я в понедельник с простым вопросом. Проблемка примерно следующая: udev при подключении/отключении какого-либо устройства добавляет в /tmp/device файл строку, например, «+ mmc» или "- mmc". Хочу в моей программе получать инфу, в момент, когда новая запись добавляется в файл. И хотел сделать это с select(). Написал примитивную программку (см ниже). Так вот прикол в том, что select() всегда возвращается и read() читает 0 данных из файла. Что я делаю не так? Может select() не годится для слеженуя за нормальными файлами? select() мне был бы интересен, поскольку есть еще в программе netlink-соцкет, который я зацепил на select(), хотелось бы еще и эту часть связать с select()

Всем заранее спасибо

int m_fd = open( «/tmp/device», O_CREAT | O_RDONLY | O_SYNC );

while(1)
{
fd_set rfds;
char buffer[10000];
int rd;

FD_ZERO( &rfds );
FD_SET( m_fd, &rfds );

pselect( m_fd+ 1, &rfds, NULL, NULL, NULL, NULL );

if( FD_ISSET(m_fd, &rfds) )
{
rd=read( m_fd, buffer, sizeof(buffer) );
}
usleep(5000000);
}

velikS
()

сообщение от udev о подключении устройства на USB

Всем привет,

Знает ли кто есть ли в udev какой механизм, чтоб оповещать приложение о подключении устройства? В моём случае, есть аппликуха, которой необходимо знать, что в данный момент подключился/отключился USB->LAN или USB-Serial converter или SD карточка. Единственное, что приходит в голову: писать файл в tmpfs и в моём приложении этот файл отслеживать, но, как мне кажется, в udev должен быть какой-то стандартный механизм

Всем спасибо за идеи,
velik

velikS
()

определить в embedded устройстве подключение/отключение по USB

Всем привет.

Есть примерно следующая проблемка, интересно мнение зала на рещения: собирается одна плата с USB хостом и слотом для SD карточки. Нужно - в программе получить сигнал, что то или иное устройство подключили/отключили и соответственно среагировать: примонтировать, переписать и т.д. Ща школьники крикнут:«udev!». Но udev слишком большой и не подходит. В busybox есть mdev. Но mdev только создает nodes в /dev.
Захотел сделать примерно следующее: в /etc/mdev.conf вписать правило, которое в известный мне файл записывает что-то известное при подключении и отключении устройства. К примеру, когда устройство подключается, появляется:

+ mmcblk0

а когда отключается, то соответственно:

- mmcblk0

Моя программа могла бы по select() присматривать за файлом.

Но фишка в том, что правило mdev, вызывается только для первой строки:


mmc.* root:1 0660 @(echo «+ $MDEV» >> /home/test)
mmc.* root:1 0660 $(echo "- $MDEV" >> /home/test)


Т.е. когда подключу устройство, то вижу в файле «+ mmcblk0», когда отключу, то ничего нового не появляется. Если поменять в правиле строки местами, то появляется строка при отключении устройства, но не при подключении.

Kто-то уже разбирался с mdev? В чем могут быть грабли?
Еще интересуют альтернативные пути. Как еще можно решить проблемку без mdev? В голову приходить только слушать uevents от Кернела по его Netlink сокету


Всем спасибо

velikS
()

Какие драйверы надо активировать, чтоб получить поддержку этого устройства?

Всем привет!

Собираю тут embedded плату на АРМ процессоре. Есть в приборе USB Host. По нему без проблем подключаю USB Memory Stick. А что надо активировать в kernel, чтоб заработал этот

http://www.delock.de/produkte/gruppen/USB%20Adapter/Delock_USB_20_Gigabit_LAN...


У меня 2.6.37

спасибо

velikS
()

Отваливается Qt приложние по «Segmentation fault»

Всем привет!

Имею примерно следующее: Система с АРМ-процессором и 64МБайт RAM на борту. Работает 2.6.37, Qt4.7.1 и rootfs собраны с Buildroot2010.11. Когда запускаю приложение собранное с Qt, получаю «Segmentation fault». Причем даже для случая, когда в main() этой программы стоит:

printf(«Test»);
return 0;

Запустил своё приложение с strace. Он выдал в конце примерно следующее:

stat(«/lib/ld-uClibc.so.0», {st_mode=S_IFREG|0755, st_size=21200, ...}) = 0
mprotect(0x40133000, 12288, PROT_READ) = 0
mprotect(0x40024000, 4096, PROT_READ) = 0
mprotect(0x40187000, 4096, PROT_READ) = 0
mprotect(0x4019f000, 4096, PROT_READ) = 0
mprotect(0x401b0000, 4096, PROT_READ) = 0
mprotect(0x40079000, 4096, PROT_READ) = 0
mprotect(0x4008b000, 4096, PROT_READ) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo ...}) = 0
getpid() = 353
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=16778261}) = 0
setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=16778261}) = 0
rt_sigaction(SIGRTMIN, {0x401970fc, [], 0x4000000 /* SA_??? */}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x40197014, [RTMIN], 0x4000000 /* SA_??? */}, NULL, 8) = 0
rt_sigaction(SIGRT_2, {0x40196480, [], 0x4000000 /* SA_??? */}, NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
brk(0) = 0x12000
brk(0x13000) = 0x13000
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++


Т.е. как я понимаю, проблема в этом?:
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=16778261}) = 0
setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=16778261}) = 0

Был запрошен лимит стэка у системы, она сказала - лимит 8МБ, запросилось установить стэк на 2МБ, ядро прислало сообщение:«Привет, ты нам не товарищ». Т.е. проблема в ядре???? Как и где можно на такое повлиять?

заранее Спасибо

velikS
()

Совершенно дурацкий вопрос: переменные окружения...

Совершенно дурацкий вопрос: переменные окружения...

Есть embedded система с 2.6.37 и BusyBox1.16 на борту. Летом был написан примитивный скрипт, который запускается из etc/init.d:

#!/bin/sh


export PATH=\
/bin:\
/sbin:\
/usr/bin:\
/usr/sbin:\
/usr/local/bin:\

export TSLIB_CONSOLEDEVICE=none
export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CALIBFILE=/home/user/ts.calibr
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_PLUGINDIR=/usr/lib/ts
export QWS_MOUSE_PROTO=«tslib:/dev/input/event1»
echo 100 > /sys/class/backlight/backlight/brightness


Когда «вручную» запускаю одну из программ, которой нужны эти переменные, то программа отваливается с сообщением, что переменная не определена. Причем, что интересно, когда запускаю эту же программу из этого скрипта, то она запускается и не жалуется.

Когда из шела набираю «echo $TSLIB_FBDEVICE», то ничего не печатается - я так понимаю, что переменная пустая. Блин, туплю я! Подскажите, как определить в sh глобальную переменную, которую будут видеть все программы

Спасибо

velikS
()

как сохранить битмап с палитрой?

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

velikS
()

rootFS через nfs. Не могу залогиниться как root

Всем привет,

Собираю тут одно embedded устройство с Линуксом на борту. Столкнулся с примерно следующей проблемой: собрал rootFS с Buildroot в каталоге /home/Developer/rootfs/rootfs. Делаю jffs2 имидж с этого каталога, записываю во флэш память устройства - всё работает на Ура. Но не кайф каждый раз программировать прибор. Поэтому настроил U-boot на загрузку ядра по TFTP и на загрузку rootFS по NFS c такими параметрами:


#define CONFIG_BOOTARGS \
«console=ttyS0,115200 root=/dev/nfs » \
«nfsroot=192.168.1.2:/home/Developer/rootfs/rootfs » \
«ip=192.168.1.3:192.168.1.2:192.168.1.1:255.255.255.0::eth0:off » \

Ядро грузится, вроде подключается rootFS, но могу залогиниться только как user, когда пробую рутом, то выдаёт:


IP-Config: Complete:
device=eth0, addr=192.168.1.3, mask=255.255.255.0, gw=192.168.1.1,
host=192.168.1.3, domain=, nis-domain=(none),
bootserver=192.168.1.2, rootserver=192.168.1.2, rootpath=
VFS: Mounted root (nfs filesystem) on device 0:12.
Freeing init memory: 172K
eth0: link up (100/Full)
Initializing random number generator... done.
Starting vsftpd: OK

Welcome to P3
P3 login: root
Login incorrect


В чём проблема? Может кто сталкивался с чем-то подобным?

Спасибо,
velik

velikS
()

Как защитить линукс-систему от считывания?

Всех с Новым ГОДОМ!!!

Несмотря на головную боль от вчерашнего спиртного, болит голова ещё и от тхнических проблем. Проблема примерно в следующем: собирается одно embеdded устройство с ARM процессором на борту. Линукс и root FS будут записаны на чипе NAND флэш памяти.

Интересно, есть ли надёжные программные способы защитить устройство от злобных китайцев, если для считывания программ уже достаточно выпаять флэшку, считать её и записать в другую?

Всем спасибо
Velik

velikS
()

Создать патч с бинарным файлом?

Всем привет.

Изменил я, к примеру, исходник u-boot и добавил в него один битмап файл. Вопрос: можно (и если да, то как) ли создать патч? Похоже с diff можно создавать только патчи текстовых файлов. Как быть с бинарником?

Всем спасибо,
Velik

velikS
()

проблема при компиляции модуля ядра

Всем привет!

Проблему немного трудно описать, но я попробую :)
Имеется Ubuntu 10.04, в котором необходимо необходимо изменить 1 строку в usbserial.c. Нашел, как народ вроде как решил эту проблему:

http://www.at91.com/forum/viewtopic.php/f,26/t,19128/st,0/sk,t/sd,a/sid,ac205...

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

make M=drivers/usb/serial/

получаю:


/usr/src/modulehack/linux-headers-2.6.32-21-generic/arch/x86/Makefile:81: stack protector enabled but no compiler support
CC [M] drivers/usb/serial/usb-serial.o
cc1: error: unrecognized command line option "-mregparm=3"
Assembler messages:
Error: unknown architecture `i586'
Error: unrecognized option -march=i586
drivers/usb/serial/usb-serial.c:1: error: bad value (i586) for -march= switch
make[1]: *** [drivers/usb/serial/usb-serial.o] Fehler 1
make: *** [_module_drivers/usb/serial] Fehler 2


Кто-то сталкивался с чем-то подобным? Как можно решить?


Спасибо за советы
Velik

velikS
()

Стандартная проблема с mount/umount «device or recourse is busy»

Всем привет!

Есть одна проблемка, думаю, для неё должно быть стандартное решение. Сразу упомяну - речь идёт о встроенной системе, где максимум, что есть - busybox. Так вот задачка в двух словах: есть устройство с SD-слотом, когда карточка вставлена, надо её примонтировать и сказать другой программе, что карта есть и можно на неё писать, ну и когда карту вытащили, надо соответственно её отмонтировать и сказать другой программе, что карты собсна нету.
Контролирую, что карта вставлена, по появлению /sys/block/mmcblk0. Когда директория, появляется монтирую с:
mount( /dev/mmcblk0p1, /mnt/SD, «vfat», MS_SYNCHRONOUS, NULL);

Когда системная директория пропадает, то отмонтирую с:
umount2( /mnt/SD, MNT_FORCE );

Всё работает хорошо, пока карта не вытаскивается во время записи другой программой. В этом случае карту невозможно отмонтировать. Максимум, что нашёл в гугле это то, что в таком случае надо «убить» программу с открытым доступом к карте, а после этого отмонтировать. Неужели нет другого решения?

Спасибо
velik

velikS
()

Примитивный вопрос: как найти в sh строку в стороке?

Всем привет!

Немного запарился гуглить отрвет на простой вопрос. Думаю, будет быстрее тут найти ответ. Проблемка следующая: есть некоторый диск, который надо монтировать. Но этот диск при первом запуске прибора может быть не отформатирован. Поэтому хочу написать скрипт, который пробует примонтировать диск, результат mount пишет в переменную-строку. Потом ищет в строке слово «failed», если находит, то форматирует диск и монтирует заново. Вопрос примитивный: как найти слово failed в строка на sh?

Всем спасибо, velik

velikS
()

С++. Callback функция

Всем привет,

Хочу реализовать примерно следующее: класс Parser, который содержит объект Socket. Socket запускает thread и при приёме данных вызывает метод в Parser и передаёт ему принятые данные.
Вопрос примерно следующий: можно ли это как-то реализовать в C++, не объявляя эту Callback функцию в Parser как static?

Всем спасибо
Velik

velikS
()

Даталоггер с ограниченным количеством строк

Всем привет!

Нужно что-то вроде syslogd, которое слушает UDP порт и записывает сообщения в лог-файл. Когда файл набирает, напримет, 1000 строк, первая строка из файла удаляется. Есть ли что-то такое готовое? syslog+cron не подходят, так как приложение будет работать во встроенной (embedded) системе c ограниченными ресурсами.

Всем спасибо,
velik

velikS
()

Как настроить avahi на 2 интерфейса?

Всем привет!


Есть небольшая проблемка, которая админам, точно, покажется смешной. Но сами мы не местные ;-) Есть устройство с интерфейсами usb0 и eth0. На оба хочу натравить avahi-autoipd. Ставлю avahi-autoipd на eth0, получаю адрес, пингую его с другого компа - всё работает. Ставлю avahi-autoipd на usb0, получаю адрес, пингую его с другого компа - всё опять работает. Но когда включаю 2 avahi на оба интерфейса, то, хотя оба и получают адреса, не могу пропинговать ни eth0 ни usb0. В чем может быть проблема и как настроить? В routing таблице стоят, естессно, 2 одинаковых пути с 169.254.0.0 и маской 255.255.0.0

Всем спасибо.
Velik

velikS
()

Как отловить «eth0: link up» и «eth0: link down»

Всем привет!

Что-т туплю я сегодня. Кто знает способ, как можно поймать два этих «сообщения» ядра. Меня интересует совершенно примитивная вещь: воткнут Ethernet кабель - есть интерфейс eth0, выткнут - нет его. Интерфейс можно «включить» с ifconfig etho up, а вот как сделать так, чтоб он «включался» с кабелем?

Спасибо за ответы

velikS
()

Подружить DHCP клиент и avahi

Всем привет,

Есть задачка примерно следующего плана: имеем прибор с LAN интерфейсом. Как один из вариантов применения этот прибор может быть подключён к какому либо роутеру. В этом случае прибор должен определять свой IP адрес по DHCP. В другом варианте применения этот прибор может быть подключён прямо к компу или к такому же прибору. В этом случае никакого DHCP сервера в системе нет и IP адрес должен определяться автоматически через Zeroconfig-avahi.

Как можно решить эту задачку? Есть ли стандартные решения?

Всем спасибо,
velik

velikS
()

IP через USB. Как узнать названия устройств?

Всем привет!

Хочу связать компьютер с одной платой (на плате есть USB host и USB device) по IP протоколу. Скомпилировал ядро для платы с поддержкой g_ether. Запускаю, конфигурирую с «ifconfig usb0». Появляется интерфейс usb0. Но вот не знаю, это USB host или USB device определился как usb0? И как опеделить какой из USBшников на компе связан с ip протоколом, если он тут тоже сконфигурировался, как usb0, а в компе 4 USB host-a?


Спасибо за ответы или за посылку к полезному источнику информации ;-)
velik

velikS
()

Как реализовать модуль, который бы выполнялся

с частотой, скажем, 100Hz? Без всяких RTAI и RT патчей...

Спасибо за идеи

velikS
()

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