gpt4 book ai didi

c - 如果 linux 命令在 C 中失败,如何跳过迭代

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

procfs.c

for(i=0;i<10;i++)
{
//linux command to check process status
sprintf(cmd, "cat /proc/%d/status", pid[i]);
pf = popen(cmd,"r");
fread(data, 1024, 1, pf);
pclose(pf);

//......big chunk of code afterwards
}

这是我在我的 ubuntu 上运行的代码的一部分。基本上,pid 数组有一些进程 ID,我希望以某种方式解析这些数据 - 这确实成功了,所以这不是问题。

问题出在结构的某些部分。最初,当我保存 pid 数组时,我使用了“ls/proc/”命令——就像我在上面的代码中使用“cat/proc/%d/status”命令一样——来检查/proc/文件夹中的所有进程当前正在运行。上面的代码运行一段时间后,所以当我使用 pid 数组列表执行时,一些程序不再运行,因此不在/proc/文件夹中(例如,程序本身)。因此,虽然所有 pid 数据都按照我希望的方式打印出来,但一些数据如下所示:

enter image description here

为了解决这个问题,我添加了一行代码,如下所示:

if(!pf) continue;

我以为这会看到命令失败,并跳过这次迭代,但它没有改变任何东西。

有什么方法可以处理该错误消息吗?

编辑:我也试过 if(pf < 0),但这也没有用。

最佳答案

使用 stat 函数查看文件是否存在,这对 /proc 文件非常有效。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat buf;
int ret = stat("/proc/2023", &buf);
if(ret == -1) {
//file doesn't exist, so proc with pid 2023 isn't running
}
else {
//file exists, so proc with pid 2023 is running
}

将其合并到您的循环中,我们有:

for(i=0;i<10;i++)
{
struct stat buf;
sprintf(cmd, "/proc/%d", pid[i]);
int ret = stat(cmd, &buf);
if(ret == -1) continue;

//linux command to check process status
sprintf(cmd, "cat /proc/%d/status", pid[i]);
pf = popen(cmd,"r");
fread(data, 1024, 1, pf);
pclose(pf);

//......big chunk of code afterwards
}

关于c - 如果 linux 命令在 C 中失败,如何跳过迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37723125/

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