gpt4 book ai didi

c - 通过 execl 向 grep 提供参数,不起作用;字符串可能的格式问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:12:57 24 4
gpt4 key购买 nike

我正在尝试通过 execl 调用 grep。在通过 stdin 将 indata fork 并通过管道传输到新进程后,我尝试这样做:

execl("/bin/grep","grep","PATH",0);

而且它有效。但是我希望能够使用

中的参数
int main(int argc, char ** argv) {}

然后我尝试:

execl("/bin/grep","grep",argv,0);

并在控制台写“./program PATH”来调用程序,但是没有用; grep 进程以退出状态 256 退出。我认为问题出在参数的格式上。 Argv 是一个以 null 结尾的 char* 数组,也许 grep 调用不喜欢那样。

我也希望有一个以上的词作为参数;例如,您可以调用“./program -z PATH”。如何解决?

完整代码:

#include <unistd.h>
#include <stdlib.h>

int main(int argc, char ** argv) {
int childExitStatus=0,childPID=0;

int cpipe0[2];
if(-1==pipe(cpipe0)) {
printf("Pipe failed");
exit(1);
}

// Fork printenv
childPID=fork();
if(-1==childPID) {
printf("Fork failed");
exit(1);
}
else if (0==childPID) {
if (-1==dup2(cpipe0[1],1)) {
printf("Pipe failed");
exit(1);
}

close(cpipe0[0]);

execl("/usr/bin/printenv","printenv",0);

printf("Execl failed");
_exit(1);
}
close(cpipe0[1]); // Close pipe0 write end
wait(&childExitStatus);
printf("Printenv exited with status: %d\n",childExitStatus);
if(childExitStatus!=0) {exit(1);}


// Fork grep
childPID=fork();
if(-1==childPID) {
printf("Fork failed");
exit(1);
}
else if (0==childPID) {
close(cpipe0[1]);
if (-1==dup2(cpipe0[0],0)) {
printf("Pipe failed");
exit(1);
}

execl("/bin/grep","grep","PATH",0);
// change to: execl("/bin/grep","grep",argv,0);
printf("Execl failed");
_exit(1);
}
wait(&childExitStatus);
printf("Grep exited with status: %d\n",childExitStatus);
if(childExitStatus!=0) {
printf("No matching environmental variables in GREP for supplied parameters\n");
exit(1);
}

return 0;
}

最佳答案

如果您要传递一个数组,您需要调用 execv()。数组中的第一项应该是程序名称,最后一项必须是 NULL,因此创建一个修改过的 argv[]:

else if (0==childPID) {
const char **myArgs = NULL;
int i;

close(cpipe0[1]);
if (-1==dup2(cpipe0[0],0)) {
printf("Pipe failed");
exit(1);
}

myArgs = calloc(argc + 1, sizeof(char *));
myArgs[0] = "grep";

for (i = 1; i < argc; ++i )
myArgs[i] = argv[i];

myArgs[argc] = NULL;

execv("/bin/grep", myArgs);
printf("Execv failed");
_exit(1);
}

关于c - 通过 execl 向 grep 提供参数,不起作用;字符串可能的格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26889549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com