2013-06-06 4 views
0

Я пытаюсь написать функцию, которая будет убивать экземпляры от имени программы в строкеftell всегда возвращает -1

unsigned int kill_all_program_instances(const char * program_name){ 
    int res; 
    char buf[1024]; 
    string first; 
    string second; 
    int lSize, pid , pos; 
    string command="pidof "; 
    FILE *fd; 
    memset(buf,'\0',sizeof(buf)); 
    fd=popen((command+program_name).c_str(),"r"); 
    unsigned int mypid = getpid(); 
    if(fd != NULL){ 
    fseek (fd , 0 , SEEK_END); 
    lSize = ftell(fd); 
    rewind (fd); 
    if (lSize <= 0) 
    { 
     printf("lsize is %d\n",lSize); 
     pclose(fd); 
     return 0; 
    } 
      ..... 
} 

Это только начало функции, но я всегда получаю -1 для lSize. Я побежал

pidof chromium-browse 

и получил

26487 19353 16993 11504 10960 10880 10868 10829 10825 10805 8607 8263 8154 8089 7764 3965 3950 

Однако, когда я бегу

kill_all_program_instances('chromium-browse') 

Я все еще получаю -1 для lSize.

Любая идея не в порядке с моим кодом?

Благодаря

+0

Пробовали ли вы смотреть на 'errno' и' strerror() '? – Vlad

+1

Можете ли вы проверить, есть ли ошибка с 'errno' и т. Д.? – Djon

+0

Я буду в секундах –

ответ

5

Помимо комментария/ответ об обнаружении ошибок для popen (который не кажется правильным), я считаю, что актуальной проблемой является то, что вы пытаетесь использовать FSEEK/ftell на трубе, которая не является действительной операцией. Труба не является «файлом» в обычном смысле, это поток данных, где каждый элемент данных может быть прочитан только один раз.

Просто прочитайте, используя fscanf() или что-то подобное, пока оно не даст вам EOF.

+0

Я проверю этот вариант .. –

0

popen() связывается с порожденным процессом с использованием труб. трубы не доступны для поиска.

Вы просто не можете использовать fseek/ftell в FILE *, возвращенном popen, они всегда будут терпеть неудачу.

Смежные вопросы