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;
}
相关推荐
XiaoHu0207几秒前
Linux网络编程(第三弹)
linux·运维·网络
liuyunshengsir2 分钟前
golang Gin 框架下的大数据量 CSV 流式下载
开发语言·golang·gin
BlockChain8882 分钟前
MPC 钱包实战(三):Rust MPC Node + Java 调度层 + ETH 实际转账(可运行)
java·开发语言·rust
吉吉613 分钟前
在 Windows 和 Linux 的 VSCode 中配置 PHP Debug
开发语言·php
蜜汁小强3 分钟前
macOS 上升级到 python 3.12
开发语言·python·macos
小乔的编程内容分享站3 分钟前
C语言结构体相关笔记
c语言·笔记
Remember_9934 分钟前
【数据结构】Java集合核心:线性表、List接口、ArrayList与LinkedList深度解析
java·开发语言·数据结构·算法·leetcode·list
小旭95274 分钟前
【Java 面试高频考点】finally 与 return 执行顺序 解析
java·开发语言·jvm·面试·intellij-idea
hixiong1235 分钟前
C# OpenVinoSharp部署Yolo26模型进行推理
开发语言·c#·openvino·yolo26
不会c嘎嘎12 分钟前
QT中的各种对话框
开发语言·qt