gpt4 book ai didi

自定义 shell glob 问题

转载 作者:行者123 更新时间:2023-11-30 14:28:01 25 4
gpt4 key购买 nike

我必须用 c 编写一个 shell 程序,不使用 system() 函数。其中一个功能是我们必须能够使用通配符。我似乎找不到一个很好的例子来说明如何使用 glob 或我遇到的这个 fnmatch 函数,所以我一直在搞乱,到目前为止我有一些工作博客功能(取决于我如何安排我的博客)代码)。

如果我有一个声明为全局的 glob 变量,那么该函数将部分工作。然而,此后的任何命令都会产生错误。示例:

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] 生成 null。似乎无法弄清楚为什么。任何了解 glob 如何工作的人都知道可能的原因是什么?如果需要的话可以发布更多代码,但这就是问题所在。

最佳答案

这对我有用:

...
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 指针。

关于自定义 shell glob 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6922261/

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