LINUX.ORG.RU

Мониторинг устройств USB

 


1

2

Имеется необходимость отслеживать подключение/отключение USB к компьютеру. Накидайте пожалуйста информации, что можно использовать. Может уже есть что-то лучше, чем опрашивать шину раз в n секунд?

udev не предлагать, его использование невозможно.

★★★★★

Ответ на: комментарий от AlexVR

Тогда уж просто парсинг /dev/kmsg. Если ничего лучше не найду, то придётся.

false ★★★★★ ()

Имеется необходимость отслеживать подключение/отключение USB к компьютеру. Накидайте пожалуйста информации, что можно использовать.

http://www.kernel.org/doc/pending/hotplug.txt

особо обрати внимание на

-- Usermode helper

не надо тут парсить постоянно - ядро само сообщает о всех событиях

anonymous ()
Ответ на: комментарий от false

ИМХО, парсинг то не особо нужен, просто при наличии новых строк сканировать usb-шину. Так, можно было бы посоветовать inotify, но он не работает на usbfs (на подключение устройств).

Ну или сами напишите udev и получайте сообщения от ядра через netlink-сокет.

mky ★★★★★ ()

Что-то странно, скопировал пример

 #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>

  #include <sys/poll.h>
  #include <sys/socket.h>
  #include <sys/types.h>
  #include <unistd.h>

  #include <linux/types.h>
  #include <linux/netlink.h>

  void die(char *s)
  {
	write(2,s,strlen(s));
	exit(1);
  }

  int main(int argc, char *argv[])
  {
	struct sockaddr_nl nls;
	struct pollfd pfd;
	char buf[512];

	// Open hotplug event netlink socket

	memset(&nls,0,sizeof(struct sockaddr_nl));
	nls.nl_family = AF_NETLINK;
	nls.nl_pid = getpid();
	nls.nl_groups = -1;

	pfd.events = POLLIN;
	pfd.fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
	if (pfd.fd==-1)
		die("Not root\n");

	// Listen to netlink socket

	if (bind(pfd.fd, (void *)&nls, sizeof(struct sockaddr_nl)))
		die("Bind failed\n");
	while (-1!=poll(&pfd, 1, -1)) {
		int i, len = recv(pfd.fd, buf, sizeof(buf), MSG_DONTWAIT);
		if (len == -1) die("recv\n");

		// Print the data to stdout.
		i = 0;
		while (i<len) {
			printf("%s\n", buf+i);
			i += strlen(buf+i)+1;
		}
	}
	die("poll\n");

	// Dear gcc: shut up.
	return 0;
  }


выводит только одно событие, потом не выходит из poll

false ★★★★★ ()

udev не предлагать, его использование невозможно

Забавно. Ты бы хоть сказал, что за операционная система такая и что за железо!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

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

false ★★★★★ ()
Ответ на: комментарий от false

сказать зачем не могу

Поди туда, не знаю куда, принеси то, не знаю что!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Дык эта, меня конкретный вопрос интересовал, почему сразу не знаю куда?

false ★★★★★ ()
Ответ на: комментарий от false

Непонятно просто, зачем тебе эмулировать udev. Разве только если устройство уж очень слабое...

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от false

Ну дык тогда попробуй скомпилить последний libusb. Твоя задача явно ещё что-то потребует.

AlexVR ★★★★★ ()
Ответ на: комментарий от AlexVR

Да нет, мне нужно только подключение/отключение и номер шины, больше ничего.

false ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.