如何在我自己的 shell 中用 C 实现 cd 命令?
How can I implement cd command in my own shell in C?
这是我的代码,我是一名西班牙学生,我无法正确解释,但是,我需要在我自己的 shell C 中实现 cd 命令。
适用于工人阶级,如果有人可以帮助实现它。
当我将 if 条件放在进程上时,cd 不起作用,但是当我将代码放在外面时,我让 cd 工作,但是,当放回 cd 时,cd 命令不会 return 到上一个目录通常会做。
如果有可以改正失败的。非常感谢。
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#define TAM 1000
void parseo(char *line, char **argv);
int main(void) {
char cad[TAM];
char *argv[TAM];
char *gdir;
char *dir;
char *to;
char buf[TAM];
pid_t pid;
int status;
while (1) {
printf("user@PC: ");
fgets(cad, 1000, stdin);
// Si encontramos un salto de linea (se pulsa enter)
if (cad[strlen(cad) - 1] == '\n')
cad[strlen(cad) - 1] = '[=11=]'; // lo marcamos como final de sentencia
parseo(cad, argv);
// Exit para salir del shell
if (!strcmp(argv[0], "exit")) exit(0);
if (!strcmp(argv[0], "cd")){
gdir = getcwd(buf, sizeof(buf));
dir = strcat(gdir, "/");
to = strcat(dir, argv[1]);
chdir(to);
//printf("Acceso a la carpeta realizado\n");
}
pid = fork();
if (pid == 0) {
if (execvp(*argv, argv) < 0) {
printf("%s: no se encontró la orden \n", argv[0]);
exit(1);
}
}else {
waitpid(pid,&status,0);
}
}
return 0;
}
void parseo(char *line, char **argv){
while (*line != '[=11=]') {
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '[=11=]';
*argv++ = line;
while (*line != '[=11=]' && *line != ' ' && *line != '\t' && *line != '\n')
line++;
}
*argv = '[=11=]'; // marca de final
}
实际上,它运行良好!唯一的问题是,在调用 chdir()
之后,您的代码继续将命令解析为外部可执行文件,但失败了。 exit
没有这个问题,因为它在 shell 可以做任何其他事情之前就退出了。 :)
将后面的代码移动到 else
块中,或在 chdir()
之后添加 continue
应该可以修复它。
(顺便说一句:chdir()
之前的 getcwd()
/ strcat()
步骤实际上是不必要的。 chdir()
适用于相对路径:例如,如果当前工作目录为/usr
,可调用chdir("bin")
进入/usr/bin
。)
这是我的代码,我是一名西班牙学生,我无法正确解释,但是,我需要在我自己的 shell C 中实现 cd 命令。 适用于工人阶级,如果有人可以帮助实现它。 当我将 if 条件放在进程上时,cd 不起作用,但是当我将代码放在外面时,我让 cd 工作,但是,当放回 cd 时,cd 命令不会 return 到上一个目录通常会做。
如果有可以改正失败的。非常感谢。
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#define TAM 1000
void parseo(char *line, char **argv);
int main(void) {
char cad[TAM];
char *argv[TAM];
char *gdir;
char *dir;
char *to;
char buf[TAM];
pid_t pid;
int status;
while (1) {
printf("user@PC: ");
fgets(cad, 1000, stdin);
// Si encontramos un salto de linea (se pulsa enter)
if (cad[strlen(cad) - 1] == '\n')
cad[strlen(cad) - 1] = '[=11=]'; // lo marcamos como final de sentencia
parseo(cad, argv);
// Exit para salir del shell
if (!strcmp(argv[0], "exit")) exit(0);
if (!strcmp(argv[0], "cd")){
gdir = getcwd(buf, sizeof(buf));
dir = strcat(gdir, "/");
to = strcat(dir, argv[1]);
chdir(to);
//printf("Acceso a la carpeta realizado\n");
}
pid = fork();
if (pid == 0) {
if (execvp(*argv, argv) < 0) {
printf("%s: no se encontró la orden \n", argv[0]);
exit(1);
}
}else {
waitpid(pid,&status,0);
}
}
return 0;
}
void parseo(char *line, char **argv){
while (*line != '[=11=]') {
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '[=11=]';
*argv++ = line;
while (*line != '[=11=]' && *line != ' ' && *line != '\t' && *line != '\n')
line++;
}
*argv = '[=11=]'; // marca de final
}
实际上,它运行良好!唯一的问题是,在调用 chdir()
之后,您的代码继续将命令解析为外部可执行文件,但失败了。 exit
没有这个问题,因为它在 shell 可以做任何其他事情之前就退出了。 :)
将后面的代码移动到 else
块中,或在 chdir()
之后添加 continue
应该可以修复它。
(顺便说一句:chdir()
之前的 getcwd()
/ strcat()
步骤实际上是不必要的。 chdir()
适用于相对路径:例如,如果当前工作目录为/usr
,可调用chdir("bin")
进入/usr/bin
。)