我有一个基于服务器端C的CGI代码:
cgiFormFileSize("UPDATEFILE", &size); //UPDATEFILE = file being uploaded
cgiFormFileName("UPDATEFILE", file_name, 1024);
cgiFormFileContentType("UPDATEFILE", mime_type, 1024);
buffer = malloc(sizeof(char) * size);
if (cgiFormFileOpen("UPDATEFILE", &file) != cgiFormSuccess) {
exit(1);
}
output = fopen("/tmp/cgi.tar.gz", "w+");
inc = size/(1024*100);
fptr = fopen("progress_bar.txt", "w+");
while (cgiFormFileRead(file, b, sizeof(b), &got_count) == cgiFormSuccess)
{
fwrite(b,sizeof(char),got_count,output);
i++;
if(i == inc && j<=100)
{
fprintf(fptr,"%d", j);
fflush(fptr);
i = 0;
j++; // j is the progress bar increment value
}
}
fclose(fptr);
cgiFormFileClose(file);
retval = system("mkdir /tmp/update-tmp;\
cd /tmp/update-tmp;\
tar -xzf ../cgi.tar.gz;\
bash -c /tmp/update-tmp/update.sh");
但是,这不能像上面所看到的那样工作。而不是将1,2,... 100打印到progress_bar.txt(由fptr引用),它在ONE GO上打印,似乎缓冲然后写入文件。 fflush()也没用。
任何线索/建议都会非常感激。
答案 0 :(得分:0)
首先,在循环之前打开文件,在结束之后关闭。太多的IO。
问题在于w+
- 这会截断您的文件。使用a+
。 (fopen帮助)
答案 1 :(得分:0)
它是一个一个地写它,它就是它如此快速地执行它,以至于你几乎不可能看到文件中包含99以外的值。
如果你在循环中放置一个sleep(1)
,这很容易证明,所以它足够慢,你可以抓住它。