Моя СОВА cm160 измеритель мощности шла с исходным приложением Windows. Я нашел приложение C для Linux, но он использует sqlite. Это хорошо для образцов нескольких дней, но я собираюсь иметь опрос каждую секунду или два навсегда, таким образом, я переписываю его для использования сервера Пост-ГРЭС (это - FOSS). Это измерит потребление нагревающегося/охлаждающего насоса: 60*60*24*365 = 31 536 000, ~ 31 миллион образцов в течение года.
Единица имеет USB-порт, но даже приложение, я нашел работы, только если пользователь является корнем (или suded).
Это странно, поскольку мой пользователь принадлежит правозащитной группе:
mune@lello:~$ groups mune
mune : mune adm dialout cdrom sudo dip plugdev lpadmin scanner saned sambashare
mune@lello:~$ ll /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 mar 2 16:58 /dev/ttyUSB0
Чтобы отладить и разработать, я использую netbean, и я должен запустить его как корень, потому что программа не получила бы доступ к единице через USB.
Это беспокоит меня: каково это могло быть?
Ubuntu 18.04.4 LTS
Спасибо
Вывод strace является слишком длинным для мини-комментария.
mune@lello:~/work/Domotica/eagle-owl.FM/testpg$ strace cm160 execve("/usr/local/bin/cm160", ["cm160"], 0x7ffe535ecfa0 /* 65 vars */) = 0 brk(NULL) = 0x55c7900bb000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=174200, ...}) = 0 mmap(NULL, 174200, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1a1d4a1000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libusb-0.1.so.4", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\27\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=30944, ...}) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1a1d49f000 mmap(NULL, 2131264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1a1d09c000 mprotect(0x7f1a1d0a3000, 2093056, PROT_NONE) = 0 mmap(0x7f1a1d2a2000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f1a1d2a2000 mmap(0x7f1a1d2a4000, 1344, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1a1d2a4000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000b\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=144976, ...}) = 0 mmap(NULL, 2221184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1a1ce7d000 mprotect(0x7f1a1ce97000, 2093056, PROT_NONE) = 0 mmap(0x7f1a1d096000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7f1a1d096000 mmap(0x7f1a1d098000, 13440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1a1d098000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=14560, ...}) = 0 mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1a1cc79000 mprotect(0x7f1a1cc7c000, 2093056, PROT_NONE) = 0 mmap(0x7f1a1ce7b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f1a1ce7b000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0 mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1a1c888000 mprotect(0x7f1a1ca6f000, 2097152, PROT_NONE) = 0 mmap(0x7f1a1cc6f000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f1a1cc6f000 mmap(0x7f1a1cc75000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1a1cc75000 close(3) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1a1d49d000 arch_prctl(ARCH_SET_FS, 0x7f1a1d49db80) = 0 mprotect(0x7f1a1cc6f000, 16384, PROT_READ) = 0 mprotect(0x7f1a1ce7b000, 4096, PROT_READ) = 0 mprotect(0x7f1a1d096000, 4096, PROT_READ) = 0 mprotect(0x7f1a1d2a2000, 4096, PROT_READ) = 0 mprotect(0x55c78f594000, 8192, PROT_READ) = 0 mprotect(0x7f1a1d4cc000, 4096, PROT_READ) = 0 munmap(0x7f1a1d4a1000, 174200) = 0 set_tid_address(0x7f1a1d49de50) = 888 set_robust_list(0x7f1a1d49de60, 24) = 0 rt_sigaction(SIGRTMIN, {sa_handler=0x7f1a1ce82cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f1a1ce8f890}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {sa_handler=0x7f1a1ce82d50, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f1a1ce8f890}, NULL, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 brk(NULL) = 0x55c7900bb000 brk(0x55c7900dc000) = 0x55c7900dc000 getcwd("/home/mune/work/Domotica/eagle-owl.FM/testpg", 512) = 45 stat("/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl.db", {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 openat(AT_FDCWD, "/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl.db", O_RDWR|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 lseek(3, 0, SEEK_SET) = 0 read(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\0\5\0\0\0\v"..., 100) = 100 fcntl(3, F_SETLK, {l_type=F_RDLCK, l_whence=SEEK_SET, l_start=1073741824, l_len=1}) = 0 fcntl(3, F_SETLK, {l_type=F_RDLCK, l_whence=SEEK_SET, l_start=1073741826, l_len=510}) = 0 fcntl(3, F_SETLK, {l_type=F_UNLCK, l_whence=SEEK_SET, l_start=1073741824, l_len=1}) = 0 access("/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl.db-journal", F_OK) = -1 ENOENT (No such file or directory) fstat(3, {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 access("/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl.db-wal", F_OK) = -1 ENOENT (No such file or directory) fstat(3, {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 lseek(3, 0, SEEK_SET) = 0 read(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\0\5\0\0\0\v"..., 1024) = 1024 lseek(3, 9216, SEEK_SET) = 9216 read(3, "\r\0\0\0\5\1c\0\1c\2\216\2\313\0039\3r\1\262\0\345\0\345\0\0\0\0\0\0\0\0"..., 1024) = 1024 lseek(3, 10240, SEEK_SET) = 10240 read(3, "\r\0\0\0\4\1]\0\2$\2_\3\301\1]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024 fcntl(3, F_SETLK, {l_type=F_UNLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = 0 fcntl(3, F_SETLK, {l_type=F_RDLCK, l_whence=SEEK_SET, l_start=1073741824, l_len=1}) = 0 fcntl(3, F_SETLK, {l_type=F_RDLCK, l_whence=SEEK_SET, l_start=1073741826, l_len=510}) = 0 fcntl(3, F_SETLK, {l_type=F_UNLCK, l_whence=SEEK_SET, l_start=1073741824, l_len=1}) = 0 access("/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl.db-journal", F_OK) = -1 ENOENT (No such file or directory) fstat(3, {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 lseek(3, 24, SEEK_SET) = 24 read(3, "\0\0\0\5\0\0\0\v\0\0\0\0\0\0\0\0", 16) = 16 fstat(3, {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 access("/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl.db-wal", F_OK) = -1 ENOENT (No such file or directory) fstat(3, {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 fcntl(3, F_SETLK, {l_type=F_UNLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = 0 getcwd("/home/mune/work/Domotica/eagle-owl.FM/testpg", 512) = 45 stat("/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl_stat.db", {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 openat(AT_FDCWD, "/home/mune/work/Domotica/eagle-owl.FM/testpg/eagleowl_stat.db", O_RDWR|O_CLOEXEC) = 4 fstat(4, {st_mode=S_IFREG|0644, st_size=11264, ...}) = 0 lseek(4, 0, SEEK_SET) = 0 read(4, "SQLite format 3\0\4\0\1\1\0@ \0\0\0\4\0\0\0\v"..., 100) = 100 brk(0x55c790104000) = 0x55c790104000 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 write(1, "Wait for cm160 device to be conn"..., 38Wait for cm160 device to be connected ) = 38 openat(AT_FDCWD, "/dev/bus/usb", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 5 fstat(5, {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0 getdents(5, /* 6 entries */, 32768) = 144 close(5) = 0
РЕШЕННЫЙ
Существуют многие библиотеки USB, не всего один.
Не только для языка (PHP, Лава, C, C++...), но даже для того же языка программирования.
Я просто пользуюсь другой библиотекой, которые предлагают пользовательский доступ к устройствам USBs. (Я также evalueting для перемещения с нуля в Java, поскольку я должен был бы переписать ответ материала DB USB один в C.)