2010-06-02 8 views
0

J'ai un base côté serveur C code CGI:CGI Buffering question

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"); 

Cependant, cela ne fonctionne pas comme comme on le voit ci-dessus. Au lieu d'imprimer 1,2, ... 100 à progress_bar.txt (référencé par fptr) un par un, il imprime à ONE GO, il semble tamponner, puis écrit dans le fichier. fflush() ne fonctionnait pas non plus.

Toute idée/suggestion serait vraiment appréciée.

+1

Comment savez-vous n'écrit pas un par un? – Freddy

+0

Comment savez-vous qu'il le fait en une seule fois? Sans retards artificiels à l'intérieur de la boucle, cela se terminera presque immédiatement. –

+0

Je n'ai pas compris ce que vous essayez de faire, et quel était le résultat attendu. S'il vous plaît donner plus d'informations. – Amirshk

Répondre

0

D'abord, ouvrez le fichier avant la boucle et fermez-le après la fin. Trop d'IO.

Le problème est ici w+ - cela tronque votre fichier. utiliser a+. (fopen aide)

+0

J'ai essayé aussi. Ouvrez le fichier avant la boucle et fermez-le après la boucle, cela ne fonctionne pas non plus. Je ne veux pas ajouter de données, je veux mettre à jour les données à chaque fois c'est pourquoi j'ai utilisé w + – Punit

+0

alors pourquoi utilisez-vous fseek? – Amirshk

+0

Pour imprimer la valeur au début du fichier à chaque fois, toutefois, dans ce cas, cela n'est pas nécessaire car l'ouverture et la fermeture du fichier sont effectuées à chaque fois. – Punit

0

Il est écrire un par un, il est juste que ça fait si vite que vous êtes infiniment peu probable de voir jamais le fichier avec une valeur autre que 99 en elle.

Ceci est facilement démontré si vous mettez un sleep(1) dans la boucle, de sorte qu'il est assez lent pour que vous l'attrapiez.

+0

Il le fait (j'ai essayé de dormir (1);), mais pas au point désiré. Une fois que CGI a copié les données et écrit dans le fichier texte; après cela, il imprime au fichier texte. – Punit

+0

Qu'est-ce qui vous fait penser que 'cgiFormFileRead()' est appelé lentement, comme le téléchargement du fichier? Il semble beaucoup plus probable que le fichier téléchargé soit complètement tamponné puis fourni à votre CGI. – caf

+0

Vous avez raison, quelque chose de ce genre se passe. Cependant, je n'ai pas compris "cgiFormFileRead() est appelé lentement, comme le fichier télécharge" Avez-vous une idée de ce que je devrais essayer maintenant – Punit