Temat: Wykładający się pakiet na openwrt

Mam oto taki kawałek kodu który działa poprawnie na zwykłym linuxie (lubuntu)
Na openwrt też działa ale po jakimś czasie systemowi brakuje pamięci.

void *ReadFile(void *arg) {
FILE *fp;
char *line = NULL;
char* linetemp = NULL;

size_t len = 0;
ssize_t read;
int poz=0, i=0;
    while (1) {            

           fp = fopen("/var/temp.txt", "r");
           if (fp != NULL) {
             i=0;
             while ((read = getline(&line, &len, fp)) != -1) {                
                poz=(int) (strchr(line,';')-line);
                if (poz>0) {
                    linetemp = substring(line, poz+1, strlen(line)-poz-1);                    
                  printf("%s \n",linetemp);
                }
             }
//             free(line);
           }
           fclose(fp);
           
  sleep(5);
  }
}

Wydawałoby się że winna jest zakomentowana linia free(line) która zwalnia przydzieloną pamięć zaalokowaną za pomocą polecenia readline.
Po odkomentowaniu tej linii nawet w zwykłym linuxie występuje błąd "segmantation fault"

Ma ktoś pomysł jak to można obejść ?

2

Odp: Wykładający się pakiet na openwrt

Sprawdź czy line nie jest null, dopiero zwolnij.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: Wykładający się pakiet na openwrt

Próbowałem sprawdzać line poprzez if (line) ...
albo if (line!=NULL) ale zawsze się wykładało

Narazie obszedłem to w ten sposób jak ktoś poradził tutaj aby odczytywać poszczególne linie
http://stackoverflow.com/questions/9206 … -line-in-c

#include <stdio.h>

int main(int argc, char* argv[])
{
    char const* const fileName = argv[1]; /* should check that argc > 1 */
    FILE* file = fopen(fileName, "r"); /* should check the result */
    char line[256];

    while (fgets(line, sizeof(line), file)) {
        /* note that fgets don't strip the terminating \n, checking its
           presence would allow to handle lines longer that sizeof(line) */
        printf("%s", line); 
    }
    /* may check feof here to make a difference between eof and io failure -- network
       timeout for instance */
    return 0;

4

Odp: Wykładający się pakiet na openwrt

Po free ustaw line na null poniewaz getline zaczyna pisac po wlasnie zwolnionej pamieci.
Jesli chcesz odczytać string po ';' to cos w styl linetemp=strchr(line,';')+1 powinno wystarczyc,
pzdr

5

Odp: Wykładający się pakiet na openwrt

@Bu21 - dzięki za podpowiedz.
Testuję od wczorajszego popołudnia + całą dobę do chwili obecnej swój pakiet poprzez odczyt linii danych fgets'em i wszystko chodzi ok.

Tylko dalej z usb coś jest nie tak bo cyklicznie dostaję błędy

Jan  1 01:19:24 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 02:01:17 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 02:22:17 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 02:34:34 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 03:18:31 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 04:33:43 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 04:40:59 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 06:21:38 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 07:09:46 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 07:31:34 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 07:40:56 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 08:08:55 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 09:01:26 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 10:35:36 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 11:31:07 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 11:44:30 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 11:49:48 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 11:55:42 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 13:26:58 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1
Jan  1 15:27:11 OpenWrt user.err kernel: ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -1

Nie wiem czy to wina sprzętu czy słabego zasilacza. Jest standardowy od edimaxa.
Pod 1 port usb mam podpiętego pendrive'a a pod drugi konwerter usb-1wire z mera projektu.