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
# :(