我正在一个 C 程序中使用系统调用来实现 cd
功能,该程序充当一个简单的 shell,并且我在目录名称方面遇到了一些问题。我感觉它与字符串有关,但到目前为止我还没有运气。
我有一个类似下面的函数:
static void parse_args(int argc, char **argv) {
// Special conditions:
if (strcmp(argv[1], "return") == 0) {
exit(0);
}
else if (strcmp(argv[1], "cd") == 0) {
if (strcmp(argv[2], "mydir") == 0) {
printf("Directory name is 'mydir'!\n");
} else {
printf("Directory name is NOT 'mydir'!\n");
}
int ret = chdir(argv[2]);
if (ret == 0) { // success
printf("Able to change directory.\n");
} else {
printf("UNABLE to change directory.\n");
}
}
// Handling piping for shell ....
}
我预先知道 argv[2]
是一个包含我想要的新目录的字符串。
我希望cd
到一个名为mydir
的现有目录,然后用argv[2]
调用changeDirectory
等于 "mydir"
。但是,如您所见,在 changeDirectory
中,我验证了 argv[2]
实际上完全等于“mydir”。
我的简单 shell 调用的结果是:
$> pwd
/foo/bar
$> cd mydir
Directory name is 'mydir'!
UNABLE to change directory.
/usr/bin/cd: line 4: cd: mydir: No such file or directory
$> pwd
/foo/bar/mydir
看起来命令成功了,但我不知道为什么会收到错误消息。
有趣的是,如果我调用 int ret = chdir("mydir");
,则不会出现此错误消息
我能以某种方式转换/清理这个参数吗?任何指针将不胜感激。我可以散吗
最佳答案
原来是改目录后忘记退出函数了。在该函数的后面,我将 cd
作为参数传递给 execvp
以将其作为程序执行。只需将后面的“Handle Piping”代码封装在 else
中即可解决此问题。
关于chdir(..) 成功返回 0 并更改目录,但输出 "No such file or directory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26197708/