2011-08-03 136 views
0

我必须写在C外壳程序,不使用system()函数。其中一个特点是我们必须能够使用通配符。我似乎无法找到一个很好的例子,说明如何使用glob或这个我一直在使用的fnmatch函数,所以我一直在搞乱,到目前为止我有一些工作博客功能(取决于我如何安排我的码)。自定义外壳水珠问题

如果我有声明为一个全局变量水珠则该功能部分工作。但是之后的任何命令都会产生错误。例如:

ls *.c 
produce correct results 
ls -l //no glob required 
null passed through 

所以我尝试使它成为一个局部变量。这是现在我的代码:

int runCommand(commandStruct * command1) { 
if(!globbing) 
    execvp(command1->cmd_path, command1->argv); 
else{ 
    glob_t globbuf; 
    printf("globChar: %s\n", globChar); 
    glob(globChar, GLOB_DOOFFS, NULL, &globbuf); 
    //printf("globbuf.gl_pathv[0]: %s\n", &globbuf.gl_pathv[0]); 
    execvp(command1->cmd_path, &globbuf.gl_pathv[0]); 
    //globfree(&globbuf); 
    globbing = 0; 
} 
return 1; 

}

当与globbuf作为本地这样做,它产生了globbuf.gl_path空[0]。似乎无法弄清楚为什么。任何人都知道全局作品知道可能是什么原因?如果需要,可以发布更多的代码,但这是问题所在。

回答

1

这个工作对我来说:

... 
glob_t glob_buffer; 
const char * pattern = "/tmp/*"; 
int i; 
int match_count; 


glob(pattern , 0 , NULL , &glob_buffer); 
match_count = glob_buffer.gl_pathc; 
printf("Number of mathces: %d \n", match_count); 

for (i=0; i < match_count; i++) 
    printf("match[%d] = %s \n",i,glob_buffer.gl_pathv[i]); 

globfree(&glob_buffer); 
... 

观察该execvp函数需要参数列表,终止与NULL指针,即我认为这将是最容易的所有元素创建自己的char ** argv副本从glob_buffer.gl_pathv[]和一个NULL指针结束。

+0

根据手册页,'glob()'已经确保发送带有空指针的缓冲区。 – Ariel

1

您所要求的GLOB_DOOFFS但你没有指定任何说法多少插槽预留数量globbuf.gl_offs

大概是作为一个全局变量,它被初始化为0

而且这样:&globbuf.gl_pathv[0]可以简单地globbuf.gl_pathv

而且不要忘了运行globfree(globbuf)

我建议在valgrind下运行你的程序,因为它可能有一些内存泄漏和/或访问未初始化的内存。

+0

Hrmm。好吧,我想这对GLOB_DOOFFS有一定意义。但是,当我手动将它初始化为0时,它根本不起作用。任何建议,一个在那里做什么?所有的记忆都根据valgrind来处理。谢谢您的帮助。 – yaegerbomb

+0

我假设你已经看到'man glob'底部的代码示例。似乎我错了'&globbuf.gl_pathv [0]',因为他们也这样做。除此之外,我不知道,对不起。也许这个bug是在你没有包含的代码中。另外,请不要使用'execvp'调用valgrind,因为这个调用将擦除程序并将其替换为另一个,所以valgrind找不到任何东西。 – Ariel

+0

这会导致内存泄漏,因为在execvp被调用后不可能释放它。这确实是一个问题。不知道如何解决这个问题。 – yaegerbomb