La mise en œuvre des Tuyaux en C shell (Unix)
Fondamentalement, j'ai créé un shell à l'aide de la norme POSIX commandes, je veux être en mesure de mettre en Œuvre la Tuyauterie. Maintenant il gère les commandes correctement, peut faire le traitement de fond avec des &. Mais j'ai besoin d'être en mesure de tuyau à l'aide de | et >>.
Par exemple quelque chose comme ceci:
cat fichier1 fichier2 >> fichier3
cat fichier1 fichier2 | plus d'
plus fichier1 | grep trucs
Voici le code que j'ai actuellement. Je tiens également à ÉVITER le "SYSTÈME" des appels. Je sais que U besoin d'utiliser dup2, mais la façon dont j'ai fait mon code est un peu bizarre, donc im espérant si quelqu'un peut me dire si il est possible de mettre en œuvre des tuyaux dans ce code? merci! Je sais dup2 est utilisé, mais aussi im def. confus sur la façon de mettre en œuvre >> AINSI que |
#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;
}
OriginalL'auteur | 2010-10-14
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de mettre en œuvre des tuyaux et de la redirection de la sortie avec votre shell, mais il ya quelques choses que j'ai remarqué:
echo "hello world"
va être problématique avec votre analyse de la méthode.Voici quelques pseudo-code pour vous aider à démarrer:
Bonne chance avec ce projet!
OriginalL'auteur Swiss
Pipes et redirections sont différents, en fait. Pour mettre en œuvre une redirection (comme
>>
) vous devez utiliserdup2
en effet. Tout d'abord, ouvrez le fichier de votre choix avec des indicateurs appropriés (pour>>
ils serontO_WRONLY|O_CREAT|O_APPEND
). Deuxièmement, à l'aide dedup2
, prendre la sortie standard (descripteur de fichier 1) une copie de cet hôtel récemment ouvert fd. Enfin, près nouvellement ouvert fd.Pour créer un canal, vous aurez besoin d'un
pipe
syscall. Lire sa page de manuel, il contient un exemple de code. Ensuite, vous aurez également besoin dedup2
de faire des descripteurs de fichier retourné parpipe
être stdin pour un processus et stdout pour l'autre, respectivement.OriginalL'auteur Roman Cheplyaka