gpt4 book ai didi

c - 无法使用 popen 函数读取命令输出

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:16 25 4
gpt4 key购买 nike

在 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;
}

在输出中有时会出现 pid=0,即使进程在“ps”命令输出中可用。因此,我试图找到这个问题背后的根本原因,我发现输入/输出缓冲机制之类的东西可能会在我的场景中产生问题。

所以我尝试在打开 popen() 之前使用 sync() 函数,奇怪的是我的函数开始以 100% 的准确率工作。

现在 sync() 函数花费太多时间(有时大约 2 分钟)来完成其执行,这是不可取的。所以我尝试使用 fflush()、fsync() 和 fdatasync(),但这些都无法正常工作。

所以请任何人告诉我这个问题背后的确切根本原因是什么以及如何适本地解决这个问题?

最佳答案

好的,错误的根本原因存储在 errno 变量中(顺便说一句,您不需要初始化)。您可以使用以下功能获取信息性消息

perror("Error: ");

如果你使用 perror,变量 errno 会被解释,你会得到一条描述性消息。

找到根本原因的另一种方法(正确的方法!)是使用 -g 标志编译程序并使用 gdb 运行二进制文件。

编辑:我强烈建议使用 gdb 调试器,这样您就可以准确地查看您的代码遵循的路径,从而可以解释您所描述的奇怪行为。

第二次编辑:Errno 存储最后一个错误(返回值)。不要像您那样调用函数,您应该编写并立即检查 errno:

if ((<function>) <0) {
perror("<function>: ");
exit(1);
}

关于c - 无法使用 popen 函数读取命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24527634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com