Как определить размер попсового потока? - PullRequest
2 голосов
/ 12 мая 2011

Я хочу определить размер потока, перезапущенный вызовом функции popen (). Я пытался использовать fseek и ftell, но он возвращает размер -1. Кто-нибудь может подсказать, как определить размер файла? Ниже приведен код, который я использую ....

   char return_val[256];
FILE *fp = NULL;
char line[256];
memset (return_val, 0, 256);
/* set the defalut value */
strncpy (return_val, "N/A", 4);
char cmd[] = "if [ -f /etc/version ]; then cut -d, -f1 -s /etc/version ; fi";

/* Open the command for reading. */
fp = popen(cmd, "r");
if (fp != NULL) 
{
    /* read the line from file */
    fgets (line, 256, fp);
    if( line != NULL)
    {
            /* copy the data */
            strncpy(return_val, line, strnlen (line, 256)); 
        }
      /* close the file */ 
    pclose (fp);
}

1 Ответ

6 голосов
/ 12 мая 2011

Вы не можете. popen дает вам канал FIFO First In First Out. Персонажи входят с одной стороны, а они выходят с другой. В природе канала вы не знаете заранее, сколько байтов будет передано.

Вы можете либо использовать внутриполосную сигнализацию, сколько байтов еще должно быть, либо реализовать буферизацию и динамическое распределение на вашей стороне.

Также поиск невозможен по каналу, потому что это просто своего рода «портал» между этими процессами. Вы знаете, как в игре «Портал» / «Portal2».

...