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()(またはその問題に関する他の呼び出し)を調べるだけで、が実行されているかどうかを確認したいと思います。出力をどこにも印刷したくありません。

manページsystem()を見てものリターンコードがよくわかりません

実行中かどうかに関係sudokuなく、res = 0.

4

7 に答える 7

9

まず、 を使用する必要がありますWEXITSTATUS(res)。この規格は、次のように明確に述べています。

command が null ポインターでない場合、 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、シェル パイプラインの代わりに使用します。

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

試すgrep "[s]uduko"

フルとして:ps aux | grep [s]uduko

これは grep 自体を表示しません。

于 2014-03-11T05:50:35.723 に答える
1

psそしてgrep無事に戻ってきました。fork'd、' execd、そしてエラーステータスを返しませんでした。それは、実行中かどうかについてはまったく何もsudoku言いません。

全体的にあなたのコードはハッキーです。ただし、これらのコマンドをハードコーディングし続けたい場合は、成功popenしたかどうかを確認するのではなく、コマンドが実際に出力した内容を使用して観察できます。system

于 2011-08-01T21:59:09.880 に答える
0

つまり、すべてのデータが解釈される前にプロセススペースで予約される可能性が高いため、コマンドは常に成功します。

それはあなたのpsがそれ自身をリストすることを意味します、そしてそれからgrepsは成功します

grep suduko

一致します

ps | grep suduko
于 2011-08-01T21:37:21.913 に答える