我为我的班级分配了这个作业,这个程序几乎完成了,但输出与它应该是相去甚远。
我在 linux 系统上运行它并使用 geany ide。
这是该程序的主要要点:
实现一个 C++ 程序,提示用户输入 2 个命令。每个输入字符串应该是一个 UNIX 命令,允许使用参数。例如,输入 1 可以是“ls -l”,输入 2 可以是“wc -l”。然后程序将创建一个管道和两个子进程。第一个子进程将运行第一个输入中指定的命令。它将输出到管道而不是标准输出。第二个子进程将运行第二个输入中指定的命令。它将从管道而不是标准输入中获取其输入。父进程将等待其两个子进程完成,然后整个过程将重复。当第一个命令输入“quit”时,执行将停止。
到目前为止,这是我的代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstring>
using namespace std;
int main() {
//Declare Variables
char firstAns[80], secondAns[80];
int rs, ansLen, pipefd[2];
int pid1, pid2;
char * command1[5], *command2[5];
char quit[] = "quit\0";
//Allocate memory for commands
for(int a=0; a<5; a++){
command1[a]=new char[80];
}
for(int b=0; b<5; b++){
command2[b]=new char[80];
}
//Asking for the commands
cout << "Please enter your first command(incl. args) or quit: ";
cin >> firstAns;
//Do the program while the first answer isn't quit
while(firstAns != quit) {
//Copy first answer into first command
ansLen = strlen(firstAns);
for(int i=0; i < ansLen; i++){
strcpy(command1[i], firstAns);
}
//Just skip to end of program if first command is quit
cout << "Please enter your second command(incl. args): ";
cin >> secondAns;
//Copy second answer into second command
ansLen = strlen(secondAns);
for(int i=0; i < ansLen; i++){
strcpy(command1[i], secondAns);
}
//pipe
rs = pipe(pipefd);
//if pipe fails to be made
if(rs == -1){
perror("Fail to create a pipe");
exit(EXIT_FAILURE);
}
//Fork for the two processes
pid1 = fork();
if (pid1 != 0){
pid2 = fork();
}
if(pid1 == -1){
perror("Fail to create a pipe");
exit(EXIT_FAILURE);
}
if(pid2 == -1){
perror("Fail to create a pipe");
exit(EXIT_FAILURE);
}
if (pid1 == 0) { // 1st child process
// close write end of pipe
close(pipefd[0]);
// duplicate
dup2(pipefd[1], 1);
//execute the input argument
rs = execvp(command1[0], command1);
//error check
if (rs == -1) {
perror("Fail to execute command");
exit(EXIT_FAILURE);
}
}
if (pid2 == 0) { // 2st child process
// close write end of pipe
close(pipefd[1]);
// duplicate
dup2(pipefd[0], 0);
//execute the input argument
rs = execvp(command2[0], command2);
//error check
if (rs == -1) {
perror("Fail to execute command");
exit(EXIT_FAILURE);
}
}
else {// parent process
// close read and write end of pipe
close(pipefd[0]);
close(pipefd[1]);
// wait for child processes
wait(&pid1);
wait(&pid2);
}
//Asking for the commands
cout << "Please enter your first command(incl. args) or quit: ";
cin >> firstAns;
}; //end of while()
return 0;
}
我没有收到任何错误,但我没有得到我想要的输出。这是它应该如何工作的示例输出:
Enter command 1 (incl. args) or quit: ls
Enter command 2 (incl. args): wc
5 5 63
Enter command 1 (incl. args) or quit: ls -l
Enter command 2 (incl. args): wc -w
47
Enter command 1 (incl. args) or quit: hello
Enter command 2 (incl. args): more
hello: No such file or directory
Enter command 1 (incl. args) or quit: quit
相反,我的输出只产生 perror,然后说 No file or directory found for the first command and Bad address for the second command,如下所示:
Enter command 1 (incl. args) or quit: ls
Enter command 2 (incl. args): wc
Failed to execute command: No such file or directory
Failed to execute command: Bad address
我猜它是因为变量在 execpv 中不匹配,但我可以稍微推动一下最终击败这个程序。
如果有人对此也有任何建议,那么退出命令似乎也不起作用。任何类型的建议都会很棒,并且会帮助这个年轻的程序员:)