2010-06-02 66 views
0

我有一個服務器端的基於C的CGI代碼: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()也沒有工作。

任何線索/建議將非常感激。

+1

你怎麼知道不是一個接一個寫的? – Freddy 2010-06-02 21:53:56

+0

你怎麼知道它一氣呵成呢?在循環內部沒有任何人爲延遲,這將幾乎立即完成。 – 2010-06-02 21:54:01

+0

我沒有理解你想要做什麼,以及預期的結果是什麼。請提供更多信息。 – Amirshk 2010-06-02 22:02:12

回答

0

首先,在循環之前打開文件並在循環結束後關閉。太多的IO。

問題是在這裏w+ - 這會截斷你的文件。使用a+。 (fopen幫助)

+0

我也嘗試過。在循環之前打開文件並在循環之後關閉它,它也不起作用。我不想追加數據,我想每次都更新數據,這就是爲什麼我使用w + – Punit 2010-06-02 21:56:39

+0

那麼爲什麼你使用fseek? – Amirshk 2010-06-02 22:00:15

+0

要每次打印文件開始處的值,但在這種情況下,這不是必需的,因爲每次都會打開和關閉文件。 – Punit 2010-06-02 22:01:19

0

一個接一個寫它,它只是它做得太快,以至於你很難看到文件的值不是99。

如果您將sleep(1)放在循環中,這很容易證明,因此它足夠慢,以便您能夠捕捉它。

+0

它這樣做(我嘗試睡覺(1);),但不是在所需的點。一旦CGI完成複製數據並寫入文本文件;之後它打印到文本文件。 – Punit 2010-06-02 22:17:54

+0

是什麼讓你認爲'cgiFormFileRead()'被緩慢調用,就像文件上傳一樣?上傳的文件看起來更有可能被完全緩衝,然後提供給您的CGI。 – caf 2010-06-02 23:24:00

+0

你是對的,這種事情正在發生。然而,我不明白「cgiFormFileRead()被緩慢調用,因爲文件上傳」你有什麼想法我現在應該嘗試 – Punit 2010-06-03 20:01:47