参数列表是否将字符串引号传递给C中的exec命令?

我正在使用execvp为命令grep -l night *执行一个新进程。 这是我的代码:

 char * argument[5]; char keyword[] = "night"; argument[0] = (char *) malloc (sizeof(char)*25); argument[1] = (char *) malloc (sizeof(char)*25); argument[2] = (char *) malloc (sizeof(char)*25); argument[3] = (char *) malloc (sizeof(char)*25); argument[4] = (char *) malloc (sizeof(char)*25); argument[0] = "grep"; argument[1] = "-l"; strcpy(argument[2],keyword); argument[3] = "*"; argument[4] = NULL; execvp ("grep", argument); 

但我得到这个程序的输出为“grep:*:没有这样的文件或目录”这是不正确的,因为从shell执行相同的命令导致包含文本“night”的文件列表。 我怀疑命令列表中的*是作为带引号的字符串发送给exec 。 我的假设是否正确? 如果是这样,我怎么能纠正这个问题? 任何帮助将受到高度赞赏。

Grep不理解“*”参数。 通常shell会扩展这些参数(称为globbing )。 当然,由于exec函数不启动shell,因此您无法获得该function。

您可以:

  • 使用启动shell的函数( system(3)popen(3)
  • 使用glob(3) ,基本上做shell工作

编辑

您可以将其写为( 未经测试 ):

 glob_t globbuf; globbuf.gl_offs = 3; /* Globbing magic. */ glob("*", GLOB_DOOFFS, NULL, &globbuf); /* That's what the 3 was for. */ globbuf.gl_pathv[0] = "grep"; globbuf.gl_pathv[1] = "-l"; globbuf.gl_pathv[2] = "night"; /* Conveniently, the list is NULL-terminated. */ execvp("grep", globbuf.gl_pathv);