系统返回码()

时间:2011-08-01 21:19:33

标签: c unix system ps

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main() {

int res = system("ps ax -o pid -o command | grep sudoku | grep gnome > /dev/null");

printf("res = %d \n", res);

return 0;
}

我想查看sudoku是否正在运行,只需检查system()的返回代码(或任何其他此类调用)。我不想在任何地方打印任何输出。

即使在查看man page

之后,我还不太了解system()的返回码

sudoku是否正在运行,我得到res = 0

7 个答案:

答案 0 :(得分:9)

首先,您应该使用WEXITSTATUS(res)。该标准明确指出:

  

如果命令不是空指针,则system()应返回   格式中命令语言解释器的终止状态   由waitpid()指定。

我怀疑问题是命令实际成功(grep发现自己)。尽量不要暂时重定向输出:

[cnicutar@fresh ~]$ ./test
  989 sh -c ps ax -o pid -o command | grep sudoku | grep gnome
res = 0

所以,因为每个命令都成功执行,返回代码将为0 :-)。你可能会在pgrep之类的情况下获得更好的运气。

答案 1 :(得分:5)

您尝试捕获grep输出的方式可能无效。

基于帖子: C: Run a System Command and Get Output?

您可以尝试以下操作。该程序使用popen()

#include <stdio.h>
#include <stdlib.h>


int main( int argc, char *argv[] )
{

    FILE *fp;
    int status;
    char path[1035];

    /* Open the command for reading. */
    fp = popen("/bin/ps -x | /usr/bin/grep gnome-sudoku", "r"); 
    if (fp == NULL) {
        printf("Failed to run command\n" );
        exit;
    }
    /* Read the output a line at a time - output it. */
    while (fgets(path, sizeof(path)-1, fp) != NULL) {
      printf("%s", path);
    }
    pclose(fp);
return 0;
}

有关popen()的参考,请参阅:

http://linux.die.net/man/3/popen

如果您尝试使用grep,那么您可以重定向grep的输出并按以下方式读取文件:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main() {

    int res = system("ps -x | grep SCREEN > file.txt");
    char path[1024];
    FILE* fp = fopen("file.txt","r");
    if (fp == NULL) {
      printf("Failed to run command\n" );
      exit;
    }
    // Read the output a line at a time - output it.
    while (fgets(path, sizeof(path)-1, fp) != NULL) {
      printf("%s", path);
    }
    fclose(fp);
    //delete the file
    remove ("file.txt");
    return 0;
}

答案 2 :(得分:3)

如果您有pgrep,请使用它而不是shell管道。

system("pgrep -x gnome-sudoku >/dev/null");

致电时

system("ps ax -o pid -o command | grep sudoku | grep gnome > /dev/null");

系统执行

sh -c 'ps ax -o pid -o command | grep sudoku | grep gnome > /dev/null'

显示在ps并传递grep过滤器。

答案 3 :(得分:1)

解决方法是将输出重定向到文件,例如:

> /tmp/isRunningSudoku

然后打开文件/tmp/isRunningSudoku并将其存储到您的res变量

答案 4 :(得分:1)

psgrep成功返回;他们fork'd,exec'd,他们没有返回任何错误状态。这绝对是 没有 关于sudoku是否正在运行。

总的来说,你的代码是hacky。但是,如果要继续对这些命令进行硬编码,可以使用popen并观察实际打印的命令,而不是查看system是否成功。

答案 5 :(得分:1)

尝试grep "[s]uduko"

已满:ps aux | grep [s]uduko

这不会显示grep本身。

答案 6 :(得分:0)

简而言之,您的命令将始终成功,因为在所有数据都是相互作用之前,它可能会在进程空间中保留。

这意味着你的ps列出了自己,然后greps成功,因为

grep suduko

将匹配

ps | grep suduko