2

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. 我的假设正确吗?如果是这样,我该如何解决这个问题?任何帮助将不胜感激。

4

1 回答 1

2

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

你可以:

  • 使用启动 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);
于 2012-03-08T21:32:17.097 回答