CGI缓冲问题

时间:2010-06-02 21:50:59

标签: c cgi

我有一个基于服务器端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()也没用。

任何线索/建议都会非常感激。

2 个答案:

答案 0 :(得分:0)

首先,在循环之前打开文件,在结束之后关闭。太多的IO。

问题在于w+ - 这会截断您的文件。使用a+。 (fopen帮助)

答案 1 :(得分:0)

一个一个地写它,它就是它如此快速地执行它,以至于你几乎不可能看到文件中包含99以外的值。

如果你在循环中放置一个sleep(1),这很容易证明,所以它足够慢,你可以抓住它。