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

通过execl向grep提供参数,不工作;字符串的可能格式问题,c,C,我想通过execl给grep打电话。通过stdin将indata分叉和管道连接到新流程后,我尝试以下方法: execl("/bin/grep","grep","PATH",0); 它是有效的。但是,我希望能够使用 int main(int argc, char ** argv) {} 然后我尝试: execl("/bin/grep","grep",argv,0); 并通过在控制台中写入“/program PATH”来调用该程序,但它不起作用;grep进程以退出状态256退出。我认为问题在于

我想通过execl给grep打电话。通过stdin将indata分叉和管道连接到新流程后,我尝试以下方法:

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;
}
#包括
#包括
int main(int argc,字符**argv){
int childExitStatus=0,childPID=0;
int cpipe0[2];
如果(-1==管道(cpipe0)){
printf(“管道故障”);
出口(1);
}
//叉形印刷机
childPID=fork();
如果(-1==childPID){
printf(“Fork失败”);
出口(1);
}
else if(0==childPID){
如果(-1==dup2(cpipe0[1],1)){
printf(“管道故障”);
出口(1);
}
收盘价(cpipe0[0]);
execl(“/usr/bin/printenv”,“printenv”,0);
printf(“Execl失败”);
_出口(1);
}
关闭(cpipe0[1]);//关闭pipe0写入端
等待(&childExitStatus);
printf(“Printenv已退出,状态为:%d\n”,childExitStatus);
如果(childExitStatus!=0){exit(1);}
//叉格雷普
childPID=fork();
如果(-1==childPID){
printf(“Fork失败”);
出口(1);
}
else if(0==childPID){
关闭(cpipe0[1]);
如果(-1==dup2(cpipe0[0],0)){
printf(“管道故障”);
出口(1);
}
execl(“/bin/grep”,“grep”,“PATH”,0);
//更改为:execl(“/bin/grep”,“grep”,argv,0);
printf(“Execl失败”);
_出口(1);
}
等待(&childExitStatus);
printf(“Grep已退出,状态为:%d\n”,childExitStatus);
如果(childExitStatus!=0){
printf(“提供的参数在GREP中没有匹配的环境变量\n”);
出口(1);
}
返回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);
}
else如果(0==childPID){
常量字符**myArgs=NULL;
int i;
关闭(cpipe0[1]);
如果(-1==dup2(cpipe0[0],0)){
printf(“管道故障”);
出口(1);
}
myArgs=calloc(argc+1,sizeof(char*);
myArgs[0]=“grep”;
对于(i=1;i
如果要传递数组,则要调用
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);
}
else如果(0==childPID){
常量字符**myArgs=NULL;
int i;
关闭(cpipe0[1]);
如果(-1==dup2(cpipe0[0],0)){
printf(“管道故障”);
出口(1);
}
myArgs=calloc(argc+1,sizeof(char*);
myArgs[0]=“grep”;
对于(i=1;i
如果要传递数组,则要调用
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);
}
else如果(0==childPID){
常量字符**myArgs=NULL;
int i;
关闭(cpipe0[1]);
如果(-1==dup2(cpipe0[0],0)){
printf(“管道故障”);
出口(1);
}
myArgs=calloc(argc+1,sizeof(char*);
myArgs[0]=“grep”;
对于(i=1;i
如果要传递数组,则要调用
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);
}
else如果(0==childPID){
常量字符**myArgs=NULL;
int i;
关闭(cpipe0[1]);
如果(-1==dup2(cpipe0[0],0)){
printf(“管道故障”);
出口(1);
}
myArgs=calloc(argc+1,sizeof(char*);
myArgs[0]=“grep”;
对于(i=1;i
您可以写入自己的
argv
。您可以使用
grep
覆盖
argv[0]
(前提是您的
strlen(argv[0])>=strlen(“grep”)
),您可以写入自己的
argv
。您可以使用
grep
覆盖
argv[0]
(前提是您的
strlen(argv[0])>=strlen(“grep”)
),您可以写入自己的
argv
。您可以使用
grep
覆盖
argv[0]
(前提是您的
strlen(argv[0])>=strlen(“grep”)
),您可以写入自己的
argv
。你可以用
grep
覆盖
argv[0]
(前提是你的
strlen(argv[0])>=strlen(“grep”)
)。为什么
calloc()
之后都初始化了?为什么
calloc()
之后都初始化了?为什么
calloc()
之后都初始化了?为什么
calloc()
之后,当所有这些都被初始化时?