#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
void getstring(char *buf, int size) {
if (fgets(buf, size, stdin) != NULL) {
buf[strcspn(buf, "\n")] = '\0'; // 移除换行符
}
}
int main(int argc, const char *argv[]) {
char *arg[32];
while (1) {
int ret = fork();
if (ret < 0) {
perror("fork");
exit(EXIT_FAILURE);
} else if (ret == 0) {
// 子进程代码
char cmd[256];
getstring(cmd, sizeof(cmd)); // 从标准输入读取命令
int i = 0;
char *res = strtok(cmd, " ");
while (res != NULL && i < 31) {
arg[i++] = strdup(res); // 为每个参数分配内存
res = strtok(NULL, " ");
}
arg[i] = NULL; // 确保参数列表以 NULL 结尾
if (strcmp(arg[0], "cd") == 0) {
if (arg[1][0] == 0 || strcmp(arg[1], "~") == 0) {
chdir("/home/IO");
} else {
chdir(arg[1]);
}
} else {
if (execvp(arg[0], arg) == -1) {
perror("execvp"); // 打印错误信息
exit(EXIT_FAILURE); // 退出子进程
}
}
// 释放分配的内存
for (int j = 0; arg[j] != NULL; j++) {
free(arg[j]);
}
exit(EXIT_SUCCESS); // 退出子进程
} else {
// 父进程代码
char *username = getlogin();
if (username == NULL) {
perror("getlogin");
exit(EXIT_FAILURE);
}
char hostname[128] = {0};
char path[128] = {0};
gethostname(hostname, sizeof(hostname));
getcwd(path, sizeof(path));
printf("\033[1;32;10m%s@%s\033[0m:\033[1;34;10m%s\033[0m$", username, hostname, path);
fflush(stdout);
wait(0); // 等待子进程结束
}
}
return 0;
}
实现虚拟终端
最新推荐文章于 2024-10-27 22:11:46 发布