1.25 实现一个终端的功能

实现一个终端的功能,包含cd的功能。

cs 复制代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

// 自定义的 fgets 函数,去除换行符
char* mygets(char* s, int size) {
    char* res = fgets(s, size, stdin);
    int len = strlen(s);
    if (s[len - 1] == '\n') {
        s[len - 1] = '\0';
    }
    return s;
}

int main(int argc, const char *argv[]) {
    while (1) {
        // 获取用户名
        char* username = getlogin();
        // 获取主机名
        char hostname[64] = {0};
        gethostname(hostname, 63);
        // 获取当前路径
        char cwd[1024] = "";
        getcwd(cwd, sizeof(cwd) - 1);

        // 打印命令提示符
        printf("\033[1;32;10m%s@%s\033[0m:\033[1;34;10m%s\033[0m$ ", username, hostname, cwd);
        fflush(stdout);

        // 读取用户输入的命令
        char shell[256] = {0};
        char* cmd[100] = {0};
        mygets(shell, 256);

        // 解析命令
        char* res = NULL;
        int i = 0;
        while (1) {
            if (res == NULL) {
                res = strtok(shell, " ");
            } else {
                res = strtok(NULL, " ");
            }

            if (res == NULL) {
                break;
            }
            cmd[i] = res;
            i++;
        }

        // 检查是否为 cd 命令
        if (cmd[0] != NULL && strcmp(cmd[0], "cd") == 0) {
            if (cmd[1] == NULL) {
                // 如果没有提供参数,默认切换到用户主目录
                const char* home = getenv("HOME");
                if (home == NULL) {
                    fprintf(stderr, "cd: 无法获取主目录\n");
                } else {
                    if (chdir(home) != 0) {
                        perror("cd");
                    }
                }
            } else {
                // 切换到指定目录
                if (chdir(cmd[1]) != 0) {
                    perror("cd");
                }
            }
            continue;
        }

        // 执行其他命令
        pid_t pid = fork();
        if (pid > 0) {
            wait(0);
        } else if (pid == 0) {
            if (execvp(cmd[0], cmd) == -1) {
                printf("%s: 未找到命令\n", cmd[0]);
                exit(EXIT_FAILURE);
            }
        } else {
            perror("fork");
        }
    }
    return 0;
}
相关推荐
CoderCodingNo3 分钟前
【GESP】C++五级真题(数论考点) luogu-B3871 [GESP202309 五级] 因数分解
开发语言·c++
froginwe118 分钟前
NumPy 字符串函数
开发语言
ComputerInBook10 分钟前
C++编程语言:标准库:第43章——C语言标准库(Bjarne Stroustrup)
c语言·c++·c语言标准库
wildlily842714 分钟前
C++ Primer 第5版章节题 第九章
开发语言·c++
特立独行的猫a15 分钟前
c++弱引用指针std::weak_ptr作用详解
开发语言·c++·智能指针·弱指针·weak_ptr
小菱形_24 分钟前
【C#】IEnumerable
开发语言·c#
爱敲点代码的小哥26 分钟前
Directoy文件夹操作对象 、StreamReader和StreamWriter 和BufferedStream
开发语言·c#
这是程序猿29 分钟前
基于java的ssm框架经典电影推荐网站
java·开发语言·spring boot·spring·经典电影推荐网站
Felven32 分钟前
盛科工业千兆网交换机丢包问题解决
网络·交换机·丢包·盛科
Nan_Shu_61434 分钟前
学习:Java (1)
java·开发语言·学习