【发布时间】:2014-07-02 09:34:11
【问题描述】:
在 Linux 中,我通过使用“pidof process_name”命令打开管道然后使用 fgets 函数读取它的输出来查找进程的 pid。但是它偶尔找不到pid。下面是我查找进程 pid 的代码。
int FindPidByProcessName(char *pName)
{
int pid = -1;
char line[30] = { 0 };
char buf[64] = { 0 };
sprintf(buf, "pidof %s", pName);
//pipe stream to process
FILE *cmd = popen(buf, "r");
if (NULL != cmd)
{
//get line from pipe stream
fgets(line, 30, cmd);
//close pipe
pclose(cmd); cmd = NULL;
//convert string to unsigned LONG integer
pid = strtoul(line, NULL, 10);
}
return pid;
}
即使进程在“ps”命令输出中可用,有时也会在输出中出现 pid=0。 所以,我试图找到这个问题背后的根本原因,我发现像输入/输出缓冲区机制这样的东西可能会在我的场景中造成问题。
所以我尝试在打开 popen() 之前使用 sync() 函数,奇怪的是我的函数开始以 100% 的准确度工作。
现在 sync() 函数花费了太多时间(大约 2 分钟)来完成它的执行,这是不可取的。所以我尝试使用 fflush()、fsync() 和 fdatasync() 但这些都不能正常工作。
所以请任何人告诉我这个问题背后的确切根本原因是什么以及如何适当地解决这个问题?
【问题讨论】:
-
我不明白你的
while循环 - 你只调用一次popen,为什么你在读取输出时循环? -
抱歉误会,这只是我用来编写函数的编码格式。它在这里没有意义,因为它是while(0)。不会循环播放。
-
当
pid是0时line的内容是什么? -
行变量为空。看到它工作了 100 次,但不知何故它失败了,你可以说它失败了 100 次。
-
添加一些运行
perror的代码,如果fgets返回 null 并告诉我们错误消息是什么。