我一直在尝试使用 C++ 制作自定义 shell。它可以工作,但是当在终端中给出 Pipe 或 > 时它不起作用

我一直在尝试使用 C++ 制作自定义 shell。它可以工作,但是当在终端中给出 Pipe 或 > 时它不起作用
#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 副本。

相关内容