Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果linux命令在C中失败,如何跳过迭代_C_Linux_Procfs - Fatal编程技术网

如果linux命令在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 } 我以为这会看到命令

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
}
我以为这会看到命令失败,并跳过这个迭代,但它没有改变任何东西

有没有办法处理这个错误消息


编辑:我也尝试了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”检查文件。而且我真的不希望解决方案是完美的。斯梅希的回答足够让我想出一些解决问题的办法,这对我来说非常好。