Ошибка сегментации в программе libusb 1.0 при запуске от имени пользователя, а не от имени sudo

Я пишу программу захвата камеры, которая использует libusb 1.0 и cImg. Он подключается к моей астрономической камере Atik 314L и делает снимки. для отображения на экране. Он отлично компилируется при компиляции под обычным пользователем или суперпользователем и хорошо работает при выполнении под пользователем root, но генерирует ошибку сегментации при запуске любым другим способом.

Я использую Code::Blocks, и стек вызовов показывает, что сегментация Ошибка возникает при вызове функции usb_control_msg():

#0 (usb_control_msg(dev=0x0, requesttype=64, request=160, value=58880, index=0 bytes=0x7fffffffe5df "\001 \346\377\377\377\177", size=1, timeout=500) (linux.c:152)

Я новичок в программировании в среде Linux, и я не знаю, что делать, чтобы это работало для обычных пользователей. Вот шаги, которые я пробовал до сих пор:

  1. Добавьте моего пользователя во все группы пользователей, чтобы узнать, не связана ли проблема с правами группы (черт возьми, я даже пытался добавить себя в «root», но это ничего не дало)
  2. Добавьте в /etc/udev/rules.d правило примерно такого содержания: PROGRAM="/home/[username]/git/camera/prog", MODE="0660", GROUP="camera"
  3. Попробуйте изменить разрешения самой программы на 777. Это была последняя попытка - я действительно не ожидал, что это сработает.

Я учусь отлаживать по ходу работы, поэтому, если вам нужны журналы или что-то еще, чтобы увидеть, что не так, просто дайте мне знать.


person user2224491    schedule 21.06.2013    source источник
comment
Добавляю себя в root?   -  person    schedule 22.06.2013
comment
Вы делали libusb_open(); где-нибудь в коде? Если вы сделаете это (для целей отладки), это должно дать вам LIBUSB_ERROR_ACCESS. Позже вы можете добавить своего пользователя в группу «root», что должно дать вам доступ ко всем USB-устройствам и uinput. Вот как вы можете отлаживать, если это проблема, связанная с доступом.   -  person    schedule 22.06.2013
comment
После добавления моего пользователя в root он все равно выдает ошибки. Любые советы относительно того, куда идти дальше?   -  person user2224491    schedule 12.07.2013
comment
Теперь вы должны показать код, что вы сделали. Почему кто-то захочет помочь вам, написав за вас весь код? Вместо этого давайте посмотрим, что вы сделали, может быть, мы сможем что-то выяснить.   -  person    schedule 12.07.2013
comment
Я попробовал это, и оказалось, что это не связано с доступом. Строка, которая вызывает ошибку сегментации, находится в /libusb-0.1.12/linux.c: ее вызывает ret = ioctl(dev->fd, IOCTL_USB_CONTROL, &ctrl);. Есть идеи, почему?   -  person user2224491    schedule 12.07.2013
comment
Извините за неясность: строка, которая вызывает ошибку сегментации, находится в /libusb-0.1.12/linux.c: ret = ioctl(dev->fd, IOCTL_USB_CONTROL, &ctrl); вызывает ее, но я не уверен, как ее отлаживать. Что я вижу, так это то, что функция ioctl передает разыменованную переменную-член, определенную вещь и переменную, которая была передана по ссылке. Я просмотрел файл ioctl.h, чтобы увидеть, как работает функция, но он мало что мне сказал, а когда я попытался найти реализацию ioctl, Code::Blocks сказал мне, что она не найдена, но я думаю, что это потому, что .c файл не включен в мой проект.   -  person user2224491    schedule 12.07.2013
comment
Надеюсь, вы включили <sys/ioctl.h>   -  person    schedule 15.07.2013


Ответы (1)


Возможно, вам потребуется установить/получить флаги устройства с помощью такой функции, как fnctl(), и в соответствии с вашими требованиями вы можете установить режим доступа к файлу (O_RDONLY / O_WRONLY / O_RDWR) и флаги создания файла (O_CREAT / O_EXCL / O_NOCTTY / O_TRUNC). Однако в Linux эта команда может изменить только флаги O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME и O_NONBLOCK.

person Community    schedule 15.07.2013