код возврата system ()

#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.


person hari    schedule 01.08.2011    source источник
comment
Вы пытались запустить свой код для других программ, например редактор Firefox или vi (когда они запущены)   -  person A. K.    schedule 02.08.2011
comment
Да, я пробовал разные процессы.   -  person hari    schedule 02.08.2011
comment
Удобный трюк: grep -e "[s]udoku"   -  person nmichaels    schedule 02.08.2011
comment
и почему там grep gnome? Похоже, это излишне усложняет испытание. Чтобы удалить весь вывод, вам нужно добавить .. > /dev/null 2>&1. Удачи.   -  person shellter    schedule 02.08.2011
comment
Если вы хотите написать сценарий оболочки, почему бы просто не написать сценарий оболочки? C - ужасный инструмент для работы.   -  person Karl Knechtel    schedule 02.08.2011
comment
@Karl Knechtel: Иногда нам нужно выполнять команды оболочки в программе. Смотрите мой пост для ответа.   -  person A. K.    schedule 02.08.2011
comment
@ Адитья, конечно, но здесь вроде не так ...   -  person Karl Knechtel    schedule 02.08.2011


Ответы (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;
}
person A. K.    schedule 01.08.2011
comment
Спасибо, похоже, что мне придется использовать ваше решение с popen. - person hari; 02.08.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 и им подобными.

person cnicutar    schedule 01.08.2011
comment
Спасибо, cnicutar, но я вас не понимаю. grep на ps не удалось. Я также попытался не перенаправлять o / p, в этом случае я вижу, что команда на боре STDOUT все еще равна 0. - person hari; 02.08.2011
comment
@hari Вы можете видеть это, потому что это действительно удается (как я объяснил). Попробуйте вместо этого pgrep sudoku. - person cnicutar; 02.08.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.

person ephemient    schedule 01.08.2011
comment
Я использую ubuntu, и мне кажется, что pgrep не работает: $ ps ax -o pid -o command | grep gnome-sudoku 2638 python / usr / games / gnome-sudoku 2657 grep --color = auto gnome-sudoku $ pgrep -x gnome-sudoku $ - person hari; 02.08.2011
comment
@hari: в Linux pgrep видит только первые 15 символов имени процесса (то есть поле имени / proc / PID / status). Я думаю, вы хотите добавить в свой конвейер команду grep -v ps ... - person Nemo; 02.08.2011
comment
@Nemo: Спасибо, вы предлагаете добавить grep -v ps в pgrep ?? - person hari; 02.08.2011
comment
@hari: Нет, я предлагаю отказаться от pgrep, перейти к исходному решению, добавить grep -v ps (или, может быть, grep -v grep) в конвейер. - person Nemo; 02.08.2011

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

> /tmp/isRunningSudoku

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

person Eric Fortis    schedule 01.08.2011

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

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

person asveikau    schedule 01.08.2011

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

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

Это не покажет сам grep.

person serg    schedule 11.03.2014

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

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

grep suduko

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

ps | grep suduko
person Edwin Buck    schedule 01.08.2011