में पाइप को कार्यान्वित करना मूल रूप से मैंने मानक पॉज़िक्स कमांड का उपयोग करके एक खोल बनाया है, मैं भी पाइपिंग को लागू करने में सक्षम होना चाहता हूं। अभी यह सही ढंग से आदेशों को संभालता है, और & के साथ पृष्ठभूमि प्रसंस्करण कर सकता है। लेकिन मुझे उपयोग करके पाइप करने में सक्षम होना चाहिए और >> साथ ही साथ। उदाहरण के लिए कुछ ऐसा: बिल्ली फ़ाइल 1 फ़ाइल 2 >> फ़ाइल 3 बिल्ली फ़ाइल 1 फ़ाइल 2 | अधिक अधिक फ़ाइल 1 | grep सामानएक सी खोल (यूनिक्स)
यहां वर्तमान में कोड है। मैं भी "सिस्टम" कॉल से बचना चाहता हूं। मुझे पता है कि यू को डुप्ली 2 का उपयोग करने की ज़रूरत है, लेकिन जिस तरह से मैंने अपना कोड किया है, वह थोड़ा अजीब है, इसलिए मुझे उम्मीद है कि अगर कोई मुझे बता सकता है कि क्या इस कोड में पाइप लागू करना संभव है? धन्यवाद! मुझे पता है कि dup2 का उपयोग किया जाता है, लेकिन मैं भी def 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;
}
आप सिस्टम कॉल से बचने की कोशिश क्यों कर रहे थे? पोर्टेबिलिटी? आप यथासंभव POSIX निर्दिष्ट सिस्टम कॉल से चिपके रह सकते हैं। इसके अलावा, आपका खोल सी और सी ++ का एक अजीब मिश्रण है। – nategoose