#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
int main()
{
char exitC[] = "exit";
do
{
char arguments[200];
cout << "Enter your arguments: ";
cin.getline(arguments, 200,'\n');
cout << "\nEntered command is: " << arguments << endl;
if (strcmp(arguments, exitC) == 0) //exiting if user enter exit
{
cout << "---Exited---";
// break;
return 0;
}
char *array[10];
int i = 0;
array[i] = strtok(arguments, " "); //tokenizing the string entered by user
while (array[i] != NULL)
{
array[++i] = strtok(NULL, " "); //tokenize on spaces
}
// array[9] = NULL;
int pid = fork();
// cout << "\n\nPID: " << pid << endl;
if (pid == 0)
{
execvp(array[0], array); //running execvp in child process
exit(0);
}
else if (pid == -1) //if fork fails
{
cout << "\nFork failed!\n";
}
if (pid > 0) //parent process
{
wait(NULL);
}
} while (1);
}
答案1
UNIX系统编程是相当大的一章。
显然,您不能更改 stdin,然后使用 main() *argv[] 读取参数。
很遗憾,这根本不是一个自定义 shell。而且你不需要 C++ 来实现它,因为 UNIX 标准 C 就是所需的全部。
如果你很认真并且想要学习,我推荐一本经典书籍,Marc Rochkind 编写的《高级 UNIX 编程》:
我相信您也可以找到可供下载的 pdf 副本。