Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11673
Последний выпуск: 19.06.2015

Программка вешает RaspberryPi

77K
22 января 2015 года
maix0044
12 / / 22.01.2015
Доброго времени суток уважаемые форумчане.

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

Простите за говнокод, только учусь:

Код:
//*******************************************************//
// name: sound-from-file.c
// dev: Максим Шорин
// date:7 января 2015
// description: Читает файл, берет от туда путь к файлу и воиспроизводит его (
// (файл должен быть не диннее 10 сек)
// gcc -o sound-from-file sound-from-file.c -lutil -lrt -lwiringPi
//********************************************************//
#include <stdlib.h>
#include <pty.h>
#include <unistd.h>
#include <stdio.h>
#include <wiringPi.h>

// переменная для строки
char line[200];
// что будем писать в файл
char *text = "stop";
// колличество символов в файле
int n = 0;
// указатель на файл
FILE *file;
// файловый дескриптор
int fd;

void play(char *audio){
    // запускаем паралельный процесс в псевдотерминале
    pid_t p = forkpty(&fd, 0, 0, 0);
    if (p == 0){
        // запускаем процесс и смотрим есть ли ошибка
        if (execlp("omxplayer", "omxplayer", audio) < 0){
            perror("error number 1");
            exit(1);
        }
    }
}

void stop(pid_t p){
    // послылаем в псевдотерминал q
    write(fd, "q", 1);
    // ожидаем завершение процесса
    waitpid(p, 0, 0);
    // закрываем файловый дескриптор
    close(fd);
}

void main(){
    while(n < 200){
        // открытие файла на чтение
        file = fopen("/www/server/sound.php","r");
        // чтение 200 символов из файла в переменную
        fgets(line,200,file);
        // возврат на начало файла
        rewind(file);
        // считаем сколько символов в файле
        while (!feof(file)){
            getc(file);
            n++;
        }
        // возврат на начало файла
        rewind(file);
        // закрываем файл
        fclose(file);
       
        // поправка на кодировку плюс небольшой запас
        if (n > 10){
            // удаляем старый файл, создаем пустой новый
            file = fopen("/www/server/sound.php","w");
            // пишем туда строку
            fprintf(file,"%s",text);
            // закрываем
            fclose(file);
            // воиспроизводим что в файле
            play(line);
            delay(10000);
            pid_t p;
            // закрываем
            stop(p);
        }else{
            // пауза 1 секунда
            delay(1000);
        }
        n = 0;
    }
}
Прошу помощи.
1.9K
22 января 2015 года
Kuzya
183 / / 19.03.2008
 
Код:
pid_t p
объявить эту переменную, там же где и line

 
Код:
fgets(line,200,file);
содержимое line ты не проверяешь не то что бы на содержимое, но даже на длину.

 
Код:
while (!feof(file)){
            getc(file);
            n++;
        }
n++; вывести за цикл

такие вот советы.
77K
22 января 2015 года
maix0044
12 / / 22.01.2015
Kuzya, спасибо за советы, буду пробовать.
1.9K
22 января 2015 года
Kuzya
183 / / 19.03.2008
 
Код:
// возврат на начало файла
rewind(file);
// закрываем файл
fclose(file);
Кстати, rewind тоже лишний, зачем его выполнять, если следом файл закрывается.
77K
27 января 2015 года
maix0044
12 / / 22.01.2015
Kuzya, спасибо, советы помогли !

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог