如果 linux 命令在 C 中失败,如何跳过迭代
How to skip iteration if linux command fails in C
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/ 文件夹中当前 [=34] 的所有进程=].上面的代码运行一段时间后,所以当我使用pid数组列表执行时,有些程序不再是运行,因此不在/proc/文件夹中(例如程序本身)。因此,虽然所有 pid 数据都按照我希望的方式打印出来,但一些数据如下所示:
为了解决这个问题,我添加了一行代码,如下所示:
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
}
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/ 文件夹中当前 [=34] 的所有进程=].上面的代码运行一段时间后,所以当我使用pid数组列表执行时,有些程序不再是运行,因此不在/proc/文件夹中(例如程序本身)。因此,虽然所有 pid 数据都按照我希望的方式打印出来,但一些数据如下所示:
为了解决这个问题,我添加了一行代码,如下所示:
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
}