linux popen获取ip地址,使用popen函数读取命令输出失败

在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'的内容是什么? –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值