CGI Buffering проблема - PullRequest
       8

CGI Buffering проблема

0 голосов
/ 03 июня 2010

У меня есть CGI-код на стороне сервера C:

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), один за другим он печатает в ОДНОМ GO, кажется, что он буферизуется, а затем записывает в файл. fflush () также не работает.

Любая подсказка / предложение будет очень признателен.

Ответы [ 2 ]

0 голосов
/ 03 июня 2010

Это означает , записывая его один за другим, просто он делает это так быстро, что вы, как ни странно, вряд ли когда-нибудь увидите файл со значением, отличным от 99.

Это легко продемонстрировать, если вы поместите sleep(1) в цикл, чтобы он был достаточно медленным, чтобы поймать его.

0 голосов
/ 03 июня 2010

Сначала откройте файл перед циклом и закройте после его окончания. Слишком много IO.

Проблема здесь w+ - это обрезает ваш файл. используйте a+. ( fopen help)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...