要在 Linux 环境下用 C 语言模拟实现一个命令解释器,包含mypwd
, mymkdir
, myrmdir
, mycd
, mylist
, mycp
, mydate
, mycreate
, mydelete
, exit
等基本命令,需要按照以下步骤进行:
理解每个命令的功能:
mypwd
: 显示当前工作目录。mymkdir
: 创建一个新目录。myrmdir
: 删除一个空目录。mycd
: 更改当前工作目录。mylist
: 列出目录中的文件和子目录。mycp
: 复制文件或目录。mydate
: 显示或设置系统日期和时间。mycreate
: 创建一个新文件。mydelete
: 删除一个文件。exit
: 退出命令解释器。设置基本框架:
实现各个命令:
添加错误处理和注释:
测试:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
char command[256];
while (1) {
printf("myprompt> ");
fgets(command, 256, stdin);
command[strcspn(command, "\n")] = 0; // Remove newline character
if (strcmp(command, "exit") == 0) {
break;
}
// 解析和执行命令...
}
return 0;
}
void mypwd() {
char cwd[1024];
if (getcwd(cwd, sizeof(cwd)) != NULL) {
printf("%s\n", cwd);
} else {
perror("mypwd failed");
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
void mypwd() {
char cwd[1024];
if (getcwd(cwd, sizeof(cwd)) != NULL) {
printf("%s\n", cwd);
} else {
perror("mypwd failed");
}
}
void mymkdir(const char *dirname) {
if (mkdir(dirname, 0755) == -1) {
perror("mymkdir failed");
}
}
void myrmdir(const char *dirname) {
if (rmdir(dirname) == -1) {
perror("myrmdir failed");
}
}
void mycd(const char *path) {
if (chdir(path) == -1) {
perror("mycd failed");
}
}
void mylist(const char *path) {
DIR *d;
struct dirent *dir;
d = opendir(path);
if (d) {
while ((dir = readdir(d)) != NULL) {
printf("%s\n", dir->d_name);
}
closedir(d);
} else {
perror("mylist failed");
}
}
void mycp(const char *source, const char *destination) {
// 这里的实现非常简单,不处理目录复制,只适用于文件
char ch;
FILE *sourceFile, *targetFile;
sourceFile = fopen(source, "r");
if (sourceFile == NULL) {
perror("Error opening source file");
exit(EXIT_FAILURE);
}
targetFile = fopen(destination, "w");
if (targetFile == NULL) {
fclose(sourceFile);
perror("Error opening target file");
exit(EXIT_FAILURE);
}
while ((ch = fgetc(sourceFile)) != EOF) {
fputc(ch, targetFile);
}
printf("File copied successfully.\n");
fclose(sourceFile);
fclose(targetFile);
}
void mydate() {
time_t t = time(NULL);
struct tm *tm = localtime(&t);
printf("%s", asctime(tm));
}
void mycreate(const char *filename) {
FILE *fp = fopen(filename, "w");
if (fp) {
printf("File created successfully.\n");
fclose(fp);
} else {
perror("mycreate failed");
}
}
void mydelete(const char *filename) {
if (remove(filename) == -1) {
perror("mydelete failed");
} else {
printf("File deleted successfully.\n");
}
}
int main() {
char command[256];
char arg1[256];
char arg2[256];
while (1) {
printf("myprompt> ");
scanf("%s", command);
if (strcmp(command, "exit") == 0) {
break;
} else if (strcmp(command, "mypwd") == 0) {
mypwd();
} else if (strcmp(command, "mymkdir") == 0) {
scanf("%s", arg1);
mymkdir(arg1);
} else if (strcmp(command, "myrmdir") == 0) {
scanf("%s", arg1);
myrmdir(arg1);
} else if (strcmp(command, "mycd") == 0) {
scanf("%s", arg1);
mycd(arg1);
} else if (strcmp(command, "mylist") == 0) {
scanf("%s", arg1);
mylist(arg1);
} else if (strcmp(command, "mycp") == 0) {
scanf("%s %s", arg1, arg2);
mycp(arg1, arg2);
} else if (strcmp(command, "mydate") == 0) {
mydate();
} else if (strcmp(command, "mycreate") == 0) {
scanf("%s", arg1);
mycreate(arg1);
} else if (strcmp(command, "mydelete") == 0) {
scanf("%s", arg1);
mydelete(arg1);
}
}
return 0;
}