如果linux命令在C中失败,如何跳过迭代
procfs.c如果linux命令在C中失败,如何跳过迭代,c,linux,procfs,C,Linux,Procfs,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 } 我以为这会看到命令
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
}
我以为这会看到命令失败,并跳过这个迭代,但它没有改变任何东西
有没有办法处理这个错误消息
编辑:我也尝试了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
}
#包括
#包括
#包括
结构统计buf;
int-ret=stat(“/proc/2023”&buf);
如果(ret==-1){
//文件不存在,因此pid 2023的proc未运行
}
否则{
//文件存在,因此pid 2023的proc正在运行
}
将其纳入您的循环中,我们有:
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
}
for(i=0;i使用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
}
#包括
#包括
#包括
结构统计buf;
int-ret=stat(“/proc/2023”&buf);
如果(ret==-1){
//文件不存在,因此pid 2023的proc未运行
}
否则{
//文件存在,因此pid 2023的proc正在运行
}
将其纳入您的循环中,我们有:
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
}
用于(i=0;不过我只有一件事。要包含types.h header,我必须#include。在for
的sprintf
中,不应该有cat
。谢谢!@JasonJ.Y.Kim-我认为这个解决方案本身是不够的。我猜一个进程可以随时停止,即在您检查文件之后,但在在你做cat
之前,我会告诉你。也许你应该先交换到代码块,这样你就可以先做cat
。@4386427-我试过的另一种方法是检查所有的pid,直到由procfs设置的最大pid。但是我不想这样做,因为我设置的最大值太大了,只是为了实验目的,这就是w为什么我先用“ls”来检查文件。而且我真的不希望解决方案是完美的。斯梅希伊的回答足够了(即使有打字错误)为了给我一些解决这个问题的想法,这对我来说是非常好的。不过,只有一件事。要包含types.h header,我必须包含。在for
loopFixed typo的第一个sprintf
中不应该有cat
。谢谢!@JasonJ.Y.Kim-我认为这个解决方案本身是不够的。我猜是专业人士cess可以在任何时候停止,即在您检查文件之后,但在您执行cat
之前。也许您应该交换到代码块,以便您首先执行cat
。@4386427-我尝试的另一种方法是检查所有pid,直到procfs设置的最大pid。但我不想这样做,因为我没有这不是最大值太大了吗?仅仅是为了实验目的,这就是为什么我先用“ls”检查文件。而且我真的不希望解决方案是完美的。斯梅希的回答足够让我想出一些解决问题的办法,这对我来说非常好。