Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Модератор
 Аватар для Curry
5153 / 3450 / 536
Регистрация: 01.06.2013
Сообщений: 7,517
Записей в блоге: 9

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

09.12.2022, 14:03. Показов 1828. Ответов 8

Студворк — интернет-сервис помощи студентам
Привет всем!
Сделал я программу обращающуюся к USB устройству на чипе FTDI.
Сейчас неважно что это за устройство. Главное программа работает. Дальше я решил добавить возможность запуска программы как демона, сделал и выяснилось что при первом же обращении в функции драйвера устройства управление обратно не возвращается.

Для этой темы я сделал минимальную программу в которой проявляется ошибка. Для демонизации я использую код некогда выложенный на форуме COKPOWEHEU-ем.

main.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include "daemon.h"
#include "ftd2xx.h"
 
void logSay(const char *format, ...){
  FILE* f=fopen("/tmp/daemon_test.log","at");
  va_list ptr; 
  if(f){
    va_start(ptr, format);
    vfprintf(f,format, ptr);
    va_end(ptr);
    fclose(f);
  }
}
 
void DoTest(){
  FT_HANDLE h;
  FT_STATUS st = FT_OpenEx("EXAMPLE",FT_OPEN_BY_DESCRIPTION,&h);
  logSay("FT_OpenEx result = %lu\n",st);
  if(st==FT_OK){
    FT_Close(h); 
    logSay("FT_Close result = %lu\n",st);
  }
}
 
int main(int argc, char **argv){
  if(argc>1 && strcmp(argv[1],"nodaemon")==0){
    logSay("Start no daemon\n");
    DoTest();
    return 0;
  }  
  if(dmn_init_std(argc, argv, NULL) != DMN_DAEMON)return 0;
#if 1
  logSay("Start as daemon\n");
  DoTest();
#else  
  while(dmn_running()){
    /*do smth*/
  }
#endif  
  return 0;
}
И дело не в конкретной реализации демона. Исходная программа не только использует другую библиотеку демонизации, но и написана на другом языке. Однако суть та же - не в режиме демона работает, лог
Start no daemon
FT_OpenEx result = 0
FT_Close result = 0
. В режиме демона
Start as daemon
То есть, из функции FT_OpenEx уже не возвращается.

Подумал, может для работы с устройствами демон должен выполняться под root-ом? Но и
Bash
1
sudo ./daemon_test
ничего не даёт.

Может кто догадается в чём тут проблема.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2022, 14:03
Ответы с готовыми решениями:

Ошибка при попытке обратиться к БД
$c_e = mysql_num_rows(mysql_query(&quot;SELECT id_user FROM users where email='&quot;.$_POST .&quot;'&quot;)); {if ($c_e&gt;0) {$errm .= &quot;Данный номер уже...

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

Disk or network error при попытке обратиться к файлу
Мне нужно разобрать .dbf файл. Я сделал это таким образом: OleDbConnection conn; OleDbDataAdapter oledbAdapter; ...

8
 Аватар для peter_irich
364 / 220 / 53
Регистрация: 18.10.2017
Сообщений: 2,351
09.12.2022, 15:59
Для начала надо оформить демон как положено, а потом проверять. Если сделать правильно, демон будет работать.
Например, в книге А. Робачевского "Оперaционная система UNIX" об этом есть отдельный параграф.
1
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
11.12.2022, 00:04
я себе написал такого простенького демона - всё работает. так что выкладывай весь код простенькой програмки.
и кстати зачем такие траблы - использовать ftd2xx в линуксе.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void DoTest()
{
    FT_DEVICE_LIST_INFO_NODE DevList[50];
    DWORD dwNumDevs;
    memset(DevList,0,sizeof(DevList));
    FT_STATUS st1 = FT_GetDeviceInfoList(DevList,&dwNumDevs);
    FT_HANDLE h;
    FT_STATUS st2 = FT_OpenEx("usb-FTDI_FT232R_USB_UART_A107N3BV-if00-port0",FT_OPEN_BY_SERIAL_NUMBER,&h);
    logSay("FT_OpenEx result = %lu\n",st2);
    if(st2==FT_OK)
    {
        FT_Close(h);
        logSay("FT_Close result = %lu\n",st2);
    }
}
int main( int argc, char **argv )
{
    logSay("start!\n");
    DoTest();
    if ( dmn_init_std( argc, argv, NULL ) != DMN_DAEMON )
        return 0;
    logSay("daemon\n");
    DoTest();
    logSay("daemon end\n");
    while ( dmn_running() )
    {
 
        /*do smth*/
    }
    return 0;
}
Code
1
2
3
4
5
start!
FT_OpenEx result = 2
daemon
FT_OpenEx result = 2
daemon end
1
Модератор
 Аватар для Curry
5153 / 3450 / 536
Регистрация: 01.06.2013
Сообщений: 7,517
Записей в блоге: 9
11.12.2022, 00:49  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
выкладывай весь код простенькой програмки
Я и выложил. А файлы daemon.h,daemon.с находятся по ссылке Запуска процесса в памяти в бесконечном цикле
Эту ссылку в стартовом посте я привёл.
До понедельника проверить не смогу. Разницу с тем что я привёл вижу только что вы вызываете FT_GetDeviceInfoList, а потом открываете устройство по серийному номеру, а не по description. Хорошо если это поможет. Пока сомневаюсь.
Цитата Сообщение от Aledveu Посмотреть сообщение
зачем такие траблы - использовать ftd2xx в линуксе.
А что нужно использовать если имеется устройство на FT232R ? Использовать его как COM-порт нельзя.Пользователю неудобно выбирать COM -порт, а по description оно само выбирается.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
11.12.2022, 01:14
я использовал FT_GetDeviceInfoList чтобы посмотреть как называется моя микруха FT232RL чтобы попробовать её использовать.

Не по теме:


но я её так не смогу использовать - у меня всегда будет ошибка, ибо для работы d2xx надо выгружать штатный драйвер из ядра. поэтому я всегда использовал FT232RL только как штатный ком порт, а для различения какой порт использовать- открывал через штатные символические ссылки /dev/serial/by-id/.....


А вот для отладки программы - самое первое что сделать - каждый чих писать в лог. может что и видно будет.
и линковка какая? статика или динамика?
я немного помучался чтобы скормить линкеру libftd2xx.a для статической линковки
0
Модератор
 Аватар для Curry
5153 / 3450 / 536
Регистрация: 01.06.2013
Сообщений: 7,517
Записей в блоге: 9
11.12.2022, 01:54  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
для работы d2xx надо выгружать штатный драйвер из ядра
Не обязательно. Мне тут подсказали.
Цитата Сообщение от Aledveu Посмотреть сообщение
каждый чих писать в лог. может что и видно будет.
Видно что перед вызовом FT_OpenEx чих есть, а сразу после нет. Управление из FT_OpenEx не возвращается. И программа не завершается, вист в памяти.
Цитата Сообщение от Aledveu Посмотреть сообщение
и линковка какая? статика или динамика?
статика, никаких проблем не было с линковкой.
CMakeLists.txt
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cmake_minimum_required(VERSION 3.0.0)
project(daemon_test VERSION 0.1.0)
 
include(CTest)
enable_testing()
 
set(SOURCES
    main.c daemon.c
)
 
add_executable(daemon_test ${SOURCES})
 
target_include_directories(daemon_test 
    PRIVATE 
        ~/drivers/ftdi
)
 
target_link_libraries( daemon_test 
    PRIVATE 
    ~/drivers/ftdi/build/libftd2xx.a
)
 
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
0
Модератор
 Аватар для Curry
5153 / 3450 / 536
Регистрация: 01.06.2013
Сообщений: 7,517
Записей в блоге: 9
12.12.2022, 00:13  [ТС]
Aledveu, в вашем варианте то же самое, виснет при первом же обращении к функции ftdi. Мне пришлось перед FT_GetDeviceInfoList вызывать FT_CreateDeviceInfoList, вот на нём теперь и виснет.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void DoTest(){
  FT_HANDLE h;
  FT_STATUS st ;//= FT_OpenEx("EXAMPLE",FT_OPEN_BY_DESCRIPTION,&h);
    FT_DEVICE_LIST_INFO_NODE DevList[50];
    DWORD i,dwNumDevs;
    char* sn=NULL;
    memset(DevList,0,sizeof(DevList));
    st = FT_CreateDeviceInfoList(&dwNumDevs);
    logSay("FT_CreateDeviceInfoList result = %lu,  dwNumDevs=%u\n",st,dwNumDevs);
    st = FT_GetDeviceInfoList(DevList,&dwNumDevs);
    logSay("FT_OpenEx FT_GetDeviceInfoList = %lu,  dwNumDevs=%u\n",st,dwNumDevs);
    for(i=0; i<dwNumDevs; i++){
        logSay("\tDescription=`%s`,  SerialNumber=`%s`\n",DevList[i].Description,DevList[i].SerialNumber);
        if(strcmp("EXAMPLE",DevList[i].Description)==0)
          sn=DevList[i].SerialNumber;
    }
    if(sn){
    st = FT_OpenEx(sn,FT_OPEN_BY_SERIAL_NUMBER,&h);
  logSay("FT_OpenEx result = %lu\n",st);
  if(st==FT_OK){
    FT_Close(h);
    logSay("FT_Close result = %lu\n",st);
  }
    }
}
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
12.12.2022, 00:22
вот тут ответ https://stackoverflow.com/ques... hen-forked
1
Модератор
 Аватар для Curry
5153 / 3450 / 536
Регистрация: 01.06.2013
Сообщений: 7,517
Записей в блоге: 9
12.12.2022, 00:50  [ТС]
Aledveu, да, наверное дело в этом. Как я понял, там советуют использовать vfork вместо fork и оставлять родительский процесс. Несколько несовместимо с демоном. Хм.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2022, 00:50
Помогаю со студенческими работами здесь

При попытке обратиться к диапазону ячеек в Excel выдаёт ошибку
Доброго времени суток! Столкнулся с такой проблемой: при обращении к диапазону ячеек в свежесозданной странице Excel выдаёт ошибку...

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

При попытке выключить PC, он просто зависает
Всем привет! Ребят, может кто сталкивался с тем, что после установки убунту и при попытке выключить PC, он просто зависает и не может его...

Зависает Server при попытке восстановления БД
Доброго времени суток, уважаемые форумчане! Столкнулся с зависанием при восстановлении БД. А именно на этом шаге...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru