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;
}
相关推荐
心祭丫丫4 分钟前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪30 分钟前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
博客zhu虎康1 小时前
实现局域网P2P通信:内网发送消息
网络·网络协议·p2p
吴声子夜歌2 小时前
Kubernetes权威指南——网络原理(一)
网络·容器·kubernetes
陈希1232 小时前
Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位
linux·服务器·网络
yeccheng3 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
联犀3 小时前
纯 Go 的 CAD 开源库 go-cad:直接解析 DWG/DXF,现在也能导出 PDF
开发语言·golang·pdf
国科安芯3 小时前
从遥控到自治:ASP4644S2B支撑星载电源健康管理与容错配电
网络·单片机·嵌入式硬件·安全·dcdc·低轨卫星·商业航天
zjxtxdy3 小时前
C++面向对象程序开发-类与对象
开发语言·c++
qq_406981035 小时前
c++拷贝构造函数
开发语言·c++