2 つのコマンドとその引数 (最大 5 つ) を受け取る代入を作成し、一方の出力を他方にパイプします。その後ループし、quit が入力されるまで再び 2 つのコマンドを要求します。
私が抱えている問題は、2番目のループで値を入力した後、2番目のコマンドを入力した直後に「Enter Command 1」を出力するなど、奇妙なことが起こることです(両方が同じ行に表示されます)。また、たとえば ls -l を入力してから cat を入力すると機能することにも気付きましたが、ls -l を入力してから wc を入力すると問題が発生します。誰かが見て、おそらく私を手伝ってくれませんか?私は一日中それに取り組んでいて、それを終えるのに1時間強残っています.
補足: はい、実行コマンドのセットアップが少しばかげていることは認識していますが、時間がなく、それをいじる時間がありません。できます。
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sstream>
using namespace std;
int main(){
//Our imput strings that the user enters.
string input1;
string input2;
//Temporary string.
string s;
//Array to hold the items passed in.
string arg1[6];
string arg2[6];
//A count of how many items they passed in.
int carg1;
int carg2;
//Loop until quit.
while(true){
//Set all our values to empty/zero
carg1 = 0;
carg2 = 0;
input1.clear();
input2.clear();
//Prompt for first command.
while(input1.empty()){
cout << "Command One (or quit): ";
getline(cin, input1);
}
//Split the string by the space to get the pieces of the command.
istringstream iss1(input1);
while (getline(iss1, s, ' ')) {
arg1[carg1] = s;
carg1++;
}
//Check if command is quit and exit if true.
if(arg1[0].compare("quit") == 0){
return 0;
}
//Prompt for command 2.
while(input2.empty()){
cout << "Command Two: ";
cin >> input2;
}
//Once again, split based on spaces.
istringstream iss2(input2);
while (getline(iss2, s, ' ')) {
//arg2.push_front(s);
arg2[carg2] = s;
carg2++;
}
//Initialize the pipe.
int pipefd[2];
if(pipe(pipefd) == -1){
perror("Pipe");
exit(EXIT_FAILURE);
}
//Create the fork to two processes.
int pid = fork();
//Switch to check for parent and child.
switch(pid){
case 0: //Child process
//Close the read pipe and standard input.
close(pipefd[0]);
close(1);
//Copy data
dup(pipefd[1]);
//Close other end of the pipe
close(pipefd[1]);
//Execute the first command. Based on how many params, call different ones.
switch(carg1){
case 1:
execlp(arg1[0].c_str(), arg1[0].c_str(), (char*)NULL);
break;
case 2:
execlp(arg1[0].c_str(), arg1[0].c_str(), arg1[1].c_str(), (char*)NULL);
break;
case 3:
execlp(arg1[0].c_str(), arg1[0].c_str(), arg1[1].c_str(), arg1[2].c_str(), (char*)NULL);
break;
case 4:
execlp(arg1[0].c_str(), arg1[0].c_str(), arg1[1].c_str(), arg1[2].c_str(), arg1[3].c_str(), (char*)NULL);
break;
case 5:
execlp(arg1[0].c_str(), arg1[0].c_str(), arg1[1].c_str(), arg1[2].c_str(), arg1[3].c_str(), arg1[4].c_str(), (char*)NULL);
break;
case 6:
execlp(arg1[0].c_str(), arg1[0].c_str(), arg1[1].c_str(), arg1[2].c_str(), arg1[3].c_str(), arg1[4].c_str(), arg1[5].c_str(), (char*)NULL);
break;
case 7:
execlp(arg1[0].c_str(), arg1[0].c_str(), arg1[1].c_str(), arg1[2].c_str(), arg1[3].c_str(), arg1[4].c_str(), arg1[5].c_str(), arg1[6].c_str(), (char*)NULL);
break;
}
return 0;
case -1: //Error
perror("fork");
exit(EXIT_FAILURE);
default: //Parent Process
//Wait for initial command to execute.
wait(&pid);
//Fork into two processes.
int pid2 = fork();
//Switch based on child and parent.
switch(pid2){
case 0: //Child process
//Close write end of pipe and standard output.
close(pipefd[1]);
close(0);
//Duplicate to standard input
dup(pipefd[0]);
//Close read end.
close(pipefd[0]);
//Execute proper command based on params
switch(carg2){
case 1:
execlp(arg2[0].c_str(), arg2[0].c_str(), (char*)NULL);
break;
case 2:
execlp(arg2[0].c_str(), arg2[0].c_str(), arg2[1].c_str(), (char*)NULL);
break;
case 3:
execlp(arg2[0].c_str(), arg2[0].c_str(), arg2[1].c_str(), arg2[2].c_str(), (char*)NULL);
break;
case 4:
execlp(arg2[0].c_str(), arg2[0].c_str(), arg2[1].c_str(), arg2[2].c_str(), arg2[3].c_str(), (char*)NULL);
break;
case 5:
execlp(arg2[0].c_str(), arg2[0].c_str(), arg2[1].c_str(), arg2[2].c_str(), arg2[3].c_str(), arg2[4].c_str(), (char*)NULL);
break;
case 6:
execlp(arg2[0].c_str(), arg2[0].c_str(), arg2[1].c_str(), arg2[2].c_str(), arg2[3].c_str(), arg2[4].c_str(), arg2[5].c_str(), (char*)NULL);
break;
case 7:
execlp(arg2[0].c_str(), arg2[0].c_str(), arg2[1].c_str(), arg2[2].c_str(), arg2[3].c_str(), arg2[4].c_str(), arg2[5].c_str(), arg2[6].c_str(), (char*)NULL);
break;
}
return 0;
case -1: //Error
perror("fork");
exit(EXIT_FAILURE);
default: //Parent Process
//wait(&pid2);
break;
}
}
}
}
出力例:
nick@nick-VirtualBox ~/Documents/Assign10 $ ./z1615629
Command One (or quit): ls -l
Command Two: wc
Command One (or quit): Command One (or quit): quit
出力例:
nick@nick-VirtualBox ~/Documents/Assign10 $ ./z1615629
Command One (or quit): ls -l
Command Two: cat
Command One (or quit): Command One (or quit):
total 32
-rwxr-xr-x 1 nick nick 13358 Nov 20 15:46 z1615629
-rw-r--r-- 1 nick nick 4544 Nov 20 15:46 z1615629.cxx
-rw-r--r-- 1 nick nick 8104 Nov 20 15:46 z1615629.o