1、创建一个程序,该程序模拟命令行shell的功能。 2、程序需要持续接受用户输入的命令,然后使用fork()和exec()系统调用来执行这些命令。 3、在shell程序这个父进程中,需等待其创建的子进程结束,并打印出子进程的退出状态。
时间: 2024-11-06 07:25:10 浏览: 21
要创建一个简单的命令行shell模拟器,你需要使用`std::cin`从用户接收输入,`fork()`函数创建新的进程,以及`exec()`系列函数(如`execvp()`)来替换当前进程并运行指定的命令。以下是一个简化的C++示例:
```cpp
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
// 帮助函数,执行外部命令
int executeCommand(const char* command) {
pid_t pid = fork();
if (pid == -1) {
perror("Fork failed");
return 1;
}
// 子进程执行命令
if (pid == 0) {
execvp(command, const_cast<char* const*>(command)); // 使用const_cast是为了避免浅拷贝
perror("Execvp failed");
exit(1);
}
// 父进程等待子进程结束并获取退出状态
int status = 0;
waitpid(pid, &status, 0);
return WEXITSTATUS(status); // 返回子进程的退出状态
}
int main() {
std::string cmd;
while (true) {
std::cout << "> ";
std::getline(std::cin, cmd);
if (cmd.empty()) continue; // 如果用户只按回车,忽略
// 检查是否有非法字符,这里只是简单地检查换行符
if (cmd.find('\n') != std::string::npos) {
std::cerr << "Invalid command: commands cannot contain newline characters\n";
continue;
}
int exitStatus = executeCommand(cmd.c_str());
if (exitStatus == 0) {
std::cout << "Command executed successfully.\n";
} else {
std::cerr << "Command execution failed with status: " << exitStatus << "\n";
}
}
return 0;
}
```
在这个例子中,我们创建了一个无限循环,持续从用户那里接收输入。如果用户输入了空字符串(或只是一个回车),我们就跳过这一轮。对于其他合法的命令,我们会尝试用`executeCommand()`函数来执行,同时捕获任何可能发生的错误。
注意这只是一个基础的示例,实际的命令行shell可能会更复杂,包括处理路径、环境变量、错误处理、管道等高级功能。此外,为了防止安全风险,例如命令注入,你应该对用户输入进行适当的验证和清理。
阅读全文