код возврата системы () - PullRequest
       13

код возврата системы ()

9 голосов
/ 02 августа 2011
#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.

Ответы [ 7 ]

9 голосов
/ 02 августа 2011

Прежде всего, вы должны использовать 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 и тому подобным.

6 голосов
/ 02 августа 2011

Способ, которым вы пытаетесь захватить вывод 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;
}
3 голосов
/ 02 августа 2011

Если у вас есть pgrep, используйте его вместо своего конвейера оболочки.

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.

1 голос
/ 11 марта 2014

Попробуйте grep "[s]uduko"

как полное: ps aux | grep [s]uduko

Это не будет отображать сам grep.

1 голос
/ 02 августа 2011

ps и grep возвращены успешно; они fork 'd, exec' d, и они не возвращали статус ошибки. Это говорит абсолютно ничего о том, работает или нет sudoku.

В целом ваш код взломан. Однако, если вы хотите продолжать жестко кодировать эти команды, вы можете использовать popen и наблюдать за тем, что на самом деле напечатаны команды, вместо того, чтобы посмотреть, успешно ли system.

1 голос
/ 02 августа 2011

Обходной путь - перенаправить вывод в файл, например ::100100

> /tmp/isRunningSudoku

, затем откройте файл /tmp/isRunningSudoku и сохраните его в переменной res

0 голосов
/ 02 августа 2011

Короче говоря, ваша команда всегда будет успешной, потому что она, вероятно, будет зарезервирована в пространстве процесса до того, как все данные будут обработаны.

Это означает, что ваш ps перечисляет себя, и тогда greps преуспевает, потому что

grep suduko

будет соответствовать

ps | grep suduko
...