=) Embarrasing. =)
Sorry for wasting your time with newbie questions. =) Very glad it works, though. Thanks alot! Best regards, Jonas --- In [email protected], j...@... wrote: > > if(tot == 0) > { > return 0; > } > > should be > > if(tot == 0) > { > close(fil); > return 0; > } > > you open and never close the file !! this is a handle leak and normal > userland instances are only allowed ot have 1024 open fds > > > > > Quoting "jonas.elofsson" <jelofs...@...>: > > > > > > > Ok, tried some other stuff, see test code below. When the counter > > 'i' reaches 128 (* 8 = 1024 files opened and closed) i get bad > > printouts from the open and read calls. > > > > > > My test code: > > > > (panna.c) > > > > #include <stdio.h> > > #include <fcntl.h> > > > > void msDelay(int ms) > > { > > int i,a; > > int delayvar=10; > > > > for (a=0;a<ms;a++) > > { > > for (i=0;i<33084;i++) > > { > > delayvar*=2; > > delayvar/=2; > > } > > } > > } > > > > float readtemp(char* pin) > > { > > int fil; > > char filename[100]; > > float tot = 0, high = 0, temp, dc; > > > > char c; > > > > sprintf(filename, "/proc/diskstats"); > > > > fil = open(filename, O_RDONLY); > > > > if(fil < 0) printf("Open error!"); > > > > if(read(fil, &c, 1) != 1) printf("Read error!"); > > > > if(tot == 0) > > { > > return 0; > > } > > > > dc = high/tot; > > > > temp = (dc - 0.32) / 0.0047; > > > > close(fil); > > > > return temp; > > } > > > > int main(void) > > { > > //printf("\x1B[1;0;0;10;31;14;4;0;0Q"); > > //printf("\x1B[2J\x1B[4;8H=)\x1B[2;3HJonas \x01 Emma"); > > > > float temp[8]; > > char* pins[8] = {"PG01", "PG02", "PG03", "PG04", "PG05", "PG16", > > "PG17", "PG18"}; > > int i, j = 0; > > > > printf("\x1B[2J"); //ClrScr > > > > while(1) > > { > > for(i = 0; i <= 7; i++) > > { > > temp[i] = readtemp(pins[i]); > > } > > > > j++; > > > > printf("\x1B[0;0H"); //GotoXY 0,0 > > > > printf(" %02.0f %02.0f %02.0f %02.0f %02.0f\n", temp[0], > > temp[1], > > temp[2], temp[3], temp[4]); > > printf(" %02.0f %02.0f %04.1f\n", temp[5], temp[6], temp[7]); > > printf(" %d", j); > > > > fflush(stdout); > > > > msDelay(10); > > > > } > > > > return 0; > > > > } > > > > Makefile: > > > > AXIS_USABLE_LIBS = UCLIBC GLIBC > > include $(AXIS_TOP_DIR)/tools/build/Rules.axis > > > > PROGS = panna > > > > all: $(PROGS) > > $(PROGS): $(PROGS).o > > $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ > > > > clean: > > rm -f $(PROGS) *.o core > > > > > > Best regards, Jonas > > > > --- In [email protected], john@ wrote: > >> > >> on proc you should use open() close() read() > >> > >> please post the complete code > >> > >> > >> > >> > >> Quoting "jonas.elofsson" <jelofsson@>: > >> > >> > Hi! > >> > > >> > I have a problem reading files in the /proc directory in C. > >> > > >> > I made a module for reading SMARTTEMP temperature sensors, and it > >> > works great. I made it to create one file for each I/O pin under > >> > /proc/smarttemp/. Working beautifully. > >> > > >> > I also made a module for controlling my LCD display, and that to > >> > works like a charm. > >> > > >> > I put together a small test program to read 8 different temperaturs > >> > from different sensors and then display them on the display updating > >> > once every second. > >> > > >> > Works great, for two minutes... > >> > > >> > Then, when one of the /proc files is read for the 1024:th time > >> > problems occurs. It turns out the file descriptors are out..! They > >> > don't seem to get relesaed when I do a fclose (I use fopen and > >> > fclose on them, is this a problem?). > >> > > >> > I get no problems if I change the program to read from a file on the > >> > normal FS instead. > >> > > >> > If I try to read some other file in /proc i get the same error after > >> > 1024 loops... So it seems it's not in my driver code. > >> > > >> > I tried to do a system("cp /proc/smarrtemp/PG01 /var/temp"); for > >> > each measurement and then reading the file in /var instead, trying > >> > to fool it a bit, just for testing. But after about 1024 copies I > >> > still get problems. > >> > > >> > I would be very thankful for any ideas about why this is and how to > >> > get it working. > >> > > >> > I use the image on ACMEs homepage, 2.6 something. =) > >> > > >> > Best regards, Jonas > >> > > >> > > >> > > >> > > >> > >> > >> > >> -- > >> John Crispin > >> hacking, coding, etc > >> blogic on irc > >> > >> _______ ________ __ > >> | |.-----.-----.-----.| | | |.----.| |_ > >> | - || _ | -__| || | | || _|| _| > >> |_______|| __|_____|__|__||________||__| |____| > >> |__| W I R E L E S S F R E E D O M > >> KAMIKAZE (bleeding edge) ----------------------- > >> * 10 oz Vodka Shake well with ice and strain > >> * 10 oz Triple sec mixture into 10 shot glasses. > >> * 10 oz lime juice Salute! > >> --------------------------------------------------- > >> > > > > > > > > > > -- > John Crispin > hacking, coding, etc > blogic on irc > > _______ ________ __ > | |.-----.-----.-----.| | | |.----.| |_ > | - || _ | -__| || | | || _|| _| > |_______|| __|_____|__|__||________||__| |____| > |__| W I R E L E S S F R E E D O M > KAMIKAZE (bleeding edge) ----------------------- > * 10 oz Vodka Shake well with ice and strain > * 10 oz Triple sec mixture into 10 shot glasses. > * 10 oz lime juice Salute! > --------------------------------------------------- >
