在Linux环境下模拟实现命令解释器用c语言实现mypwd「粉丝答疑」

发布时间:2023年12月22日

粉丝提问

Solution

要在 Linux 环境下用 C 语言模拟实现一个命令解释器,包含mypwd, mymkdir, myrmdir, mycd, mylist, mycp, mydate, mycreate, mydelete, exit等基本命令,需要按照以下步骤进行:

  1. 理解每个命令的功能

    • mypwd: 显示当前工作目录。
    • mymkdir: 创建一个新目录。
    • myrmdir: 删除一个空目录。
    • mycd: 更改当前工作目录。
    • mylist: 列出目录中的文件和子目录。
    • mycp: 复制文件或目录。
    • mydate: 显示或设置系统日期和时间。
    • mycreate: 创建一个新文件。
    • mydelete: 删除一个文件。
    • exit: 退出命令解释器。
  2. 设置基本框架

    • 创建一个循环,接收用户输入的命令。
    • 解析命令,确定要执行的操作。
  3. 实现各个命令

    • 使用C语言的标准库函数和系统调用来实现每个命令。
  4. 添加错误处理和注释

    • 确保每个命令都有适当的错误处理。
    • 添加注释以解释代码的功能。
  5. 测试

    • 对每个命令进行测试,确保它们按预期工作。

1. 基本框架

#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;
}

2. 实现mypwd

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;
}
文章来源:https://blog.csdn.net/qq_33254766/article/details/135144163
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。