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

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

21.05.2014, 05:47. Показов 1934. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru