10
#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()我不希望在任何地方打印任何输出。

system()即使在查看手册页后,我也不太明白的返回码

无论是否sudoku运行,我都得到res = 0.

4

7 回答 7

9

首先,您应该使用WEXITSTATUS(res). 该标准明确规定:

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

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

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

因此,由于每个命令都成功执行,因此返回码将为 0 :-)。你可能会有更好pgrep的运气等等。

于 2011-08-01T21:27:46.127 回答
7

您尝试捕获的输出的方式grep可能不起作用。

基于帖子: C:运行系统命令并获取输出?

您可以尝试以下方法。该程序使用 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;
}
于 2011-08-01T21:55:07.880 回答
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过滤器。

于 2011-08-01T21:32:28.990 回答
1

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

> /tmp/isRunningSudoku

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

于 2011-08-01T21:43:30.147 回答
1

psgrep成功返回;他们fork'd,exec'd,他们没有返回任何错误状态。这完全没有说明是否sudoku正在运行。

总体而言,您的代码很hacky。但是,如果您想继续硬编码这些命令,您可以使用popen并观察实际打印的命令,而不是查看是否system成功。

于 2011-08-01T21:59:09.880 回答
1

尝试grep "[s]uduko"

完整:ps aux | grep [s]uduko

这不会显示 grep 本身。

于 2014-03-11T05:50:35.723 回答
0

简而言之,您的命令将始终成功,因为它很可能在所有数据被干预之前被保留在进程空间中。

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

grep suduko

将匹配

ps | grep suduko
于 2011-08-01T21:37:21.913 回答