Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 14

После пары часов работы popen() начинает возвращать NULL

21.05.2014, 05:47. Показов 1911. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый.
Программирую демона, который запускает некоторые процессы.
Все бы ничего, но после пары часов работы popen() начинает непременно возвращать NULL.
Использую такой код для запуска процессов:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char* getCommand(char command[128]) 
{
        FILE *pCom;
        static char comText[256];
        bzero(comText, 256);
        char  buf[64];
        pCom = popen(command, "r"); 
        if(pCom == NULL) 
        {
            writeLog("Error Command");
            return "Error Command";
        }
        strcpy(comText, "");
        while(fgets(buf, 64, pCom) != NULL) 
        { 
            strcat(comText, buf);
        }
        pclose(pCom);
        return comText;
}
Демона пишу в первый раз, помогите, пожалуйста, понять в чем проблема
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2014, 05:47
Ответы с готовыми решениями:

после 2 часов работы компьютера начинает тухнуть экран
Здравствуйте У меня такая проблема после 2 часов работы компьютера начинает тухнуть экран (компьютер все еще в работе) звук чего либо...

Windows 8.1 начинает тормозить после нескольких часов работы
Через несколько часов работы (примерно часа через 3) система начинает помаленьку подтормаживать, и со временем это подтормаживание все...

Начинает гудеть сабвуфер после примерно 4-5 часов работы
Система TDE 262. Система поключена к ЖК-телевизору. В работе около 5 лет и все это время была подключена к телевизору. Колонки исправны....

6
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.05.2014, 10:33
Лучший ответ Сообщение было отмечено yarik_ya как решение

Решение

Как минимум, в логи нужно писать сообщение об ошибке - станет яснее в чем проблема (см man perror, strerror).
Если яснее не станет - погонять valgrind-ом на предмет утечек памяти.
В приведенном коде я не вижу защиты от переполнения буфера comText.

В общем, начать с более подробного логирования. Потому что анализировать методом тыка фрагмент кода с неизвестными входными данными - дело неблагодарное.
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 14
21.05.2014, 15:17  [ТС]
Входное данное, на котором случился "затык", выдержка из лога:

2014-05-21 12:34:04 :: bash /disp/ping.sh 172.16.2.32
==========================

2014-05-21 12:34:04 :: Error Command
==========================

Раньше не прерывал работу, судя по логу, проблема не во входных данных, т.к. при любых данных popen() NULL начинал возвращать.

Добавлено через 3 часа 39 минут
при ошибке возвращает Cannot allocate memory

Добавлено через 10 минут
Получил такой результат при падении с помощью такой строки: writeLog(strerror(errno));
О какой памяти может идти речь?

Добавлено через 17 минут
Спасибо за совет.
Судя по графикам ВМ, постпенно растет потребление и cpu и оперативы.
Значит что-то не вычищаю в ходе работы демона.
Демон обращается к БД, таскает оттуда задания и запускает процессы их с помощью функции, код которой предоставил.
Куда копать дальше?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.05.2014, 19:32
Я уже выше написал - погонять под valgrind'ом, посмотреть где конкретно течет.
1
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 14
22.05.2014, 06:51  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Я уже выше написал - погонять под valgrind'ом, посмотреть где конкретно течет.
valgrind'ом запускал, лог есть, надо бы теперь просто разобраться, что он мне нарисовал, дел с ним не имел, увы.

Добавлено через 1 час 24 минуты
2 утечки нашел, устранил. А третья не понятно откуда берется.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
==31734== Syscall param write(buf) points to uninitialised byte(s)
==31734==    at 0x565D17D: ??? (syscall-template.S:82)
==31734==    by 0x4E6D1AC: net_real_write (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4E6D67A: net_flush (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4E6D82F: net_write_command (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4E6A829: cli_advanced_command (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4E68BCC: mysql_send_query (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4E68BE8: mysql_real_query (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x402E57: refreshTask (in /disp/disp)
==31734==    by 0x4028E7: Daemon (in /disp/disp)
==31734==    by 0x402538: main (in /disp/disp)
==31734==  Address 0x66e8e8c is 28 bytes inside a block of size 8,199 alloc'd
==31734==    at 0x4C28BED: malloc (vg_replace_malloc.c:263)
==31734==    by 0x4E86D21: my_malloc (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4E6CC42: my_net_init (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4E68D5C: mysql_real_connect (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
==31734==    by 0x4023A0: main (in /disp/disp)
Но я нигде не использую mysql_real_query в программе.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.05.2014, 11:49
Да тут сообщение не про утечку, а про неинициализированные данные. Еще и в библиотеке - так что все равно.
Что я тут скажу... Почитать доки по валгринду, обратить внимание на опцию --leak-check http://valgrind.org/docs/manual/quick-start.html
Меня в описании проблемы смущает еще рост потребления cpu - мб там создается куча потоков, в каждом из которых бесконечный цикл?
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 14
23.05.2014, 07:29  [ТС]
Спасибо, вроде все работает.
4349 root 20 0 2347m 1.5g 564 R 39.6 76.4 389:08.93 memcheck-amd64-
CPU похоже грузил мемчекер, который запускался с valgrind'ом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2014, 07:29
Помогаю со студенческими работами здесь

Музыка начинает прерываться спустя несколько часов после начала работы
Привет всем. Такая проблема. Компьютер работает отлично и всё хорошо. Но спустя несколько часов работы, начинает прерываться музыка во...

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

Начинает виснуть после 20-40 минут работы
Через 20-40 минут работы компьютер начинает сильно зависать (загрузка памяти на 100%)

Начинает тормозить после длительной работы
Здравствуйте. У меня стоит ОС Windows Se7eN Максимальная, компьютеру 2 года. Раньше подобного (На Win XP) не замечал. Бывает засидишься за...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru