本文共 882 字,大约阅读时间需要 2 分钟。
在Linux中,我使用“pidof process_name”命令打开管道,然后使用fgets函数读取输出,从而找到进程的pid。但它偶尔会发现一次失败。以下是我的代码,用于查找我的流程的pid。使用popen函数读取命令输出失败
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(),但这些都不能正常工作。
所以请任何人告诉我这个问题背后的确切根源以及如何正确解决这个问题?
+0
我不明白你的'while'循环 - 你只是调用'popen'一次,你为什么而循环读取输出? –
+0
抱歉误会,这只是我用来编写函数的编码格式。它在这里没有意义,因为它是(0)。它不会被循环。 –
+0
当'pid'为'0'时,'line'的内容是什么? –
转载地址:http://vbvpo.baihongyu.com/