开发者

return code of system()

开发者 https://www.devze.com 2023-03-25 16:59 出处:网络
#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\");
#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;
}

I want to see if sudoku is running or not by just examining the return code of system() (or any other call for that matter). I do not want any output to be printed anywhere.

I do not quite understand the return code of system() even after looking at the man page

Whether 开发者_如何学Csudoku is running or not, I get res = 0.


First of all, you should be using WEXITSTATUS(res). The standard clearly states:

If command is not a null pointer, system() shall return the termination status of the command language interpreter in the format specified by waitpid().

I suspect the problem is that the command actually succeeds (grep finds itself). Try not to redirect the output for a moment:

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

So, since every commands executes successfully, the return code will be 0 :-). You might have better luck with pgrep and the like.


The way you are trying to capture the output of grep may not work.

Based on the post: C: Run a System Command and Get Output?

You can try the following. This program uses 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;
}

For reference to popen() see:

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

And if you try to use grep then you can probably redirect the output of grep and read the file in the following way:

#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;
}


If you have pgrep, use it instead of your shell pipeline.

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

When you call

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

the system executes

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

which shows up in ps and passes the grep filters.


A workaround is to redirect the output to a file e.g.:

> /tmp/isRunningSudoku

then open the file /tmp/isRunningSudoku and store it to your res variable


ps and grep returned succesfully; they fork'd, exec'd, and they did not return any error status. That says absolutely nothing about whether or not sudoku is running.

Overall your code is hacky. However, if you want to continue to hardcode these commands you can use popen and observe what the commands actually printed, rather than looking at whether or not system succeeded.


Try grep "[s]uduko"

as full: ps aux | grep [s]uduko

This will not show grep itself.


In short, your command will always succeed because it is likely to be reserved in the process space before all the data is interperted.

That means your ps lists itself, and then the greps succeed because

grep suduko

will match

ps | grep suduko
0

精彩评论

暂无评论...
验证码 换一张
取 消