我正在尝试编写一个函数,它将按字符串
中的程序名来终止实例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;
}
.....
}
这只是函数的开头,但我总是为lSize得到-1。 我跑了
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')
我仍然为lSize获得-1。
我的代码有什么问题吗?
由于
答案 0 :(得分:5)
除了关于检测popen
的错误的评论/答案(这似乎不正确)之外,我确实认为实际的问题是你试图在管道上使用fseek / ftell,这不是有效的操作。管道不是传统意义上的“文件”,它是一个数据流,其中每个数据项只能读取一次。
只需使用fscanf()
或类似内容阅读,直到它为您提供EOF。
答案 1 :(得分:0)
popen()使用管道与生成的进程通信。管道不可寻找。
你根本不能在popen返回的FILE *上使用fseek / ftell,它们总是会失败。