#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
。
答案 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)
ps
和grep
成功返回;他们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