Реализация конвейеров в оболочке C (Unix)

В основном я создал оболочку, используя стандартные команды POSIX, я также хочу иметь возможность реализовать конвейер. Сейчас он правильно обрабатывает команды и может выполнять фоновую обработку с помощью &. Но мне нужно иметь возможность использовать | и >> тоже.

В основном я создал оболочку, используя стандартные команды POSIX, я также хочу иметь возможность реализовать конвейерную обработку. Сейчас он правильно обрабатывает команды и может выполнять фоновую обработку с помощью &. Но мне нужно иметь возможность использовать | и >> тоже.

В основном я создал оболочку, используя стандартные команды POSIX, я также хочу иметь возможность реализовать конвейерную обработку. Сейчас он правильно обрабатывает команды и может выполнять фоновую обработку с помощью &. Но мне нужно иметь возможность использовать | и >> тоже. Например что-то вроде этого: кошка файл1 файл2 >> файл3 cat file1 file2 | Больше больше file1 | grep stuff

Вот код, который у меня есть. Я также хочу ИЗБЕЖАТЬ "СИСТЕМНЫХ" звонков. Я знаю, что вам нужно использовать dup2, но то, как я сделал свой код, немного странно, поэтому я надеюсь, что кто-нибудь скажет мне, возможно ли реализовать каналы в этом коде? Спасибо! Я знаю, что используется dup2, но также im def. запутался в том, как реализовать >> как ХОРОШО как |

#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stdlib.h> 
#include <stdio.h>

using namespace std;


void Execute(char* command[],bool BG)
{
//Int Status is Used Purely for the waitpid, fork() is set up like normal.
    int status;
    pid_t pid = fork();


    switch(pid)
    {
        case  0:
            execvp(command[0], command);

            if(execvp(command[0], command) == -1)
            {
                cout << "Command Not Found" << endl;
                exit(0);
            }

          default:
            if(BG == 0)
            {
                    waitpid(pid, &status, 0);
//Debug             cout << "DEBUG:Child Finished" << endl;
            }


    }

}


bool ParseArg(char* prompt, char* command[], char Readin[],bool BG)
{

    fprintf(stderr, "myshell>");
        cin.getline(Readin,50);
    prompt = strtok(Readin, " ");
    int i = 0;

    while(prompt != NULL)
    {
        command[i] = prompt;
        if(strcmp(command[i], "&") == 0){
//Debug        cout << "& found";
        command[i] = NULL;
        return true;
    }
//Debug        cout << command[i] << " ";
        i++;
        prompt = strtok(NULL, " ");

    }
    return false;
}

void Clean(char* command[])
{
//Clean Array
        for(int a=0; a < 50; a++)
        {
             command[a] = NULL;
        }
}



int main()
{
   char* prompt;
   char* command[50];
   char Readin[50]; 
   bool BG = false;



   while(command[0] != NULL)
   {

        Clean(command);
       BG = ParseArg(prompt, command, Readin, BG);
       if(strcmp(command[0], "exit") == 0 || strcmp(command[0], "quit") == 0 )
       {
             break;
       }

    else
    {
            Execute(command,BG);
    }

   }

   return 1;

}
5
задан 14 October 2010 в 05:36
поделиться