0

execvp 経由で grep を実行する小さなプログラムを作成しようとしています。これは基本的に私がここで抱えていた問題と同じですが、この場合、grep を実行した場合にのみ発生し (すべて正常に動作する echo、ls、emacs などとは対照的に)、間違った wait() を変更しました (私は信じている)。検索したいテキストに引用符を使用してみました

私のコード:

int main(void) {

  int i;
  char inputprogram[50];
  char vars[50] = "a search.txt";
  printf("input grep\n");
  fflush(stdout);
  fgets(inputprogram,50,stdin);
  for(i = 0; i < 50; i++){
            if(inputprogram [i] == '\n' ){
                inputprogram[i] = 0;
            }
        }
  char *arg [] = {inputprogram, vars , NULL};
  printf(">%s<\n", arg[1]);
  printf(">%s<\n", arg[0]);

  int status = 0;
  pid_t child;

  (child = fork());
  if(child == 0){
    printf("execute\n");
    execvp(inputprogram,  arg);
    exit(1);
  }
  else{
    printf("parent waiting...\n");
    wait(&status);
  }
  return EXIT_SUCCESS;
}

検索.txt:

a
b
c
abc

入出力 (# は入力した行の前にありますが、入力の一部ではありません):

shell> # ./work
input grep
# grep
>a search.txt<
>grep<
parent waiting...
execute
# a;dlghasdf
# go back
# :(
4

3 に答える 3

1

関数execvpは、渡された配列内の個別の引数として各引数を想定しています。スペースを含む単一の引数として「vars」を渡しています。Grepは、標準入力(ここではコンソール)からの入力を待機しており、「search.txt」を含む行を検索しています。次のプログラムはあなたが期待することをします。

#include "unistd.h"
int main(void) 
{
  char * executable = "grep";
  char *arg[] = { executable, "a","search.txt", NULL };
  execvp(executable, arg);
  return 0;
}

検索された文字列を独自の引数として渡すことにより、grepはリスト内の次の引数を検索するファイルとして扱います。

そのプログラムが私のために行うことは次のとおりです。

ericu@eric-phenom-linux:~$ gcc -o execgrep /home/ericu/execgrep.c 
ericu@eric-phenom-linux:~$ ./execgrep 
a
abc
ericu@eric-phenom-linux:~$ cat search.txt 
c
b
a
abc
ericu@eric-phenom-linux:~$ 

現在行っていることを反映するようにサンプルプログラムを変更する

#include "unistd.h"
int main(void) 
{
   char * executable = "grep";
   char *arg[] = { executable, "a search.txt", NULL };
   execvp(executable, arg);
   return 0;
}

標準入力からの入力を期待するプログラムになります。

ericu@eric-phenom-linux:~$ echo -e "Review the man page from proper usage of execvp.a search.txt\nThis line does not show up in the output" | ./execgrep 
Review the man page from proper usage of execvp.a search.txt
ericu@eric-phenom-linux:~$ 
于 2013-03-09T03:50:24.700 に答える
0

起動したアプリの終了ステータスを取得した後

wait(&status);

WIFEXITEDマクロを使用して、それを解釈します。

if ( WIFEXITED (status) )
    printf("App exit status = %u ",WEXITSTATUS(status));
}
于 2013-03-08T16:17:35.243 に答える
0

入出力を処理する前に、プログラムが機能することを確認してください。これは、エラーを再現するための小さなプログラムです。

int main(void) 
{
  char *arg[] = { "grep", "a search.txt", NULL };
  execvp("/bin/grep", arg);
  return EXIT_SUCCESS;
}

ただし、 の最初の文字列がなければ、argうまくいくようです:

int main(void) 
{
  char *arg[] = { "a search.txt", NULL };
  execvp("/bin/grep", arg);
  return EXIT_SUCCESS;
}

ただし、 の値に依存する理由はわかりませんargv[0]

于 2013-03-08T16:22:52.413 に答える