我正在使用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
的现有目录,并调用changeDirectory
argv[2]
等于"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");
,则不会出现此错误消息
我可以以某种方式投射/消毒这个参数吗?任何指针都将非常感激。我可以吗?
答案 0 :(得分:1)
原来我忘了在更改目录后退出该功能。稍后在函数中,我将cd
作为参数传递给execvp
来执行它,就好像它是一个程序一样。简单地封装后来的" Handle Piping" else
中的代码解决了此问题。