我正在用C/Ubuntu为一个项目编写自己的shell,但是在使用chdir()
实现cd
时遇到了一些困难。chdir()
需要路径名,但由于用户将写入(假设)cd Desktop
,Desktop
不是路径名,因此程序将失败。
以下是我的代码:
child = fork();
if (child == 0) {
if (!strcmp(args[0], "ls")) {
execv("/bin/ls", args);
}
if (!strcmp(args[0] , "cd")) {
chdir(args[1]);
}
perror("Error");
exit(1); //Failure
} else {
do {
waitpid(child, &status, WUNTRACED);
} while(!WIFEXITED(status) && !WIFSIGNALED(status));
所以我认为问题是
args[1]
得到的是"Desktop"
等,而不是地址,所以chdir
失败了。我在终端进行了测试,除了cd
之外,其他所有命令都可以工作。我的问题是,我如何才能让这个chdir
工作?换言之,我如何才能给出args[1]
到chdir
的路径?让我这样说。当我写
cd Desktop
到终端时,它就工作了。当我将cd Desktop
写入自己的shell时,它会尝试执行chdir("Desktop")
而失败。 最佳答案
使用“exec
”运行ls
命令,在选择执行哪个命令之前,我怀疑您fork()
进程:chdir(args[1])
在子进程中执行,子进程更改其当前目录,然后退出。每个进程都有自己的当前目录。父(shell)处理当前目录时不受其子目录更改的影响,而是保留其当前目录。
大多数命令应该在shell进程中执行,而不是分叉,只有外部命令应该在分叉到子进程之后执行。
以下是代码的修改版本:
/* frist execute local commands in the shell process. */
if (!strcmp(args[0], "cd")) {
if (!args[1]) {
fprintf(stderr, "cd: missing argument\n");
} else
if (chdir(args[1])) {
perror("chdir");
}
} else
if (!strcmp(args[0], "exit")) {
int status = args[1] ? atoi(argv[1]) : 0;
exit(status);
} else {
/* otherwise, fork and attempt to execute an external command */
child = fork();
if (child == 0) {
if (!strcmp(args[0], "ls")) {
execv("/bin/ls", args);
}
/* if exec failed, the child process is still running */
perror("exec");
exit(1); //Failure
} else {
do {
waitpid(child, &status, WUNTRACED);
} while(!WIFEXITED(status) && !WIFSIGNALED(status));
}
关于c - 在C中找到知道名称的文件地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35813837/