On Tuesday 08 September 2009 09:39:40 pm you wrote: > Hi again... > > int fd; /* RS232 serial link */ > int fdp; /* file descriptor for a regular file */ > struct stat stat; > size_t bytes = 0; > void *buffer; /* buffer, will be allocated */ > ... > while (bytes < stat.st_size) { > ret = read(fdp, buffer + bytes, stat.st_size - bytes); > if (ret == -1) { > perror("read"); > return -1; > } > ret = write(fd, buffer + bytes, ret); > if (ret == -1) { > perror("write"); > return -1; > } > bytes += ret; > progress = (int) (bytes * 100) / stat.st_size; > printf("\rcompleted: %i%%", progress); /* NO OUTPUT, UNTIL LOOP > ENDED */ fflush(stdout); > } > ... > > Then i see printf() never output the message until the loop has ended... > 'fdp' is a file descriptor to a local file, i send it through a serial > connection (RS232), > i use a serial connection so i can practice Linux's File I/O operation > in real world ;p > > the receiver can output the progress's message, but the sender (the > above code) could not... > this is the receiver codes: > > ... > while (bytes < size) { > ret = read(fd, buffer + bytes, size - bytes); > if (ret == -1) { > perror("read"); > return -1; > } > ret = write(fdp, buffer + bytes, ret); > if (ret == -1) { > perror("write"); > return -1; > } > bytes += ret; > > progress = (int) (bytes * 100) / size; > printf("\rcompleted: %i%%", progress); /* HAS OUTPUT */ > fflush(stdout); > } > ... > > On Tue, Sep 8, 2009 at 8:49 PM, Glynn Clements<glynn@xxxxxxxxxxxxxxxxxx> wrote: > > Tim Walberg wrote: > >> Maybe you want "(bytes * 100) / size"? > > > > However, if int and size_t are 32-bit, that will overflow at around > > 20 or 40 MB (20 for signed, 40 for unsigned), which isn't really all > > that much. Converting to either double or long long might be wise, > > i.e. > > > > percent = (int)(bytes * 100.0) / size; > > or: > > percent = (int)(bytes * 100LL) / size; > > > > -- > > Glynn Clements <glynn@xxxxxxxxxxxxxxxxxx> > > -- > To unsubscribe from this list: send the line "unsubscribe > linux-c-programming" in the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html Your printf statements are being buffered by the system. If enough of them accumulate you will see them being printed "inside the loop". You need to disable buffering or print to STDERR. -- To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html