我正在尝试写一个小程序通过execvp运行grep。这与我在这里遇到的问题基本相同,但在这种情况下,它只发生在我运行grep(而不是echo, ls, emacs等,它们都可以正常工作)并且我更改了不正确的wait()(我相信)时。我也试过在文本上使用引号,我想找到
我代码:int main(void) {
int i;
char inputprogram[50];
char vars[50] = "a search.txt";
printf("input grepn");
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("executen");
execvp(inputprogram, arg);
exit(1);
}
else{
printf("parent waiting...n");
wait(&status);
}
return EXIT_SUCCESS;
}
search.txt:
a
b
c
abc
输入/输出(#在我输入的行前面,但不是输入的一部分):
shell> # ./work
input grep
# grep
>a search.txt<
>grep<
parent waiting...
execute
# a;dlghasdf
# go back
# :(
execvp函数期望传入的数组中的每个参数都是单独的参数。您正在传递'vars'作为单个参数,其中包含空格。Grep正在等待来自标准输入(这里的控制台)的输入,并正在搜索包含'a 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.txtnThis 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:~$
获取已启动应用程序的退出状态后
wait(&status);
解释它,使用WIFEXITED宏,
if ( WIFEXITED (status) )
printf("App exit status = %u ",WEXITSTATUS(status));
}
在处理输入/输出之前,请确保您的程序正常工作。这是一个重现错误的小程序:
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]
的值