Прежде всего, Привет и спасибо за вашу помощь!
Я пытаюсь понять IPC с неназванными каналами.В частности, я собираюсь связаться с Maxima, чтобы расширить вход, который был извлечен из stdin и отправлен на вход Maxima, а затем этот вывод отправлен в stdout.Поэтому просто прочитайте ввод из stdin, отправьте его потомку и затем запишите вывод в stdout.В настоящее время я получил его для вывода:
Ввод "> (x + 2) ^ 2"
(% o2) x ^ 2 + 4x + 4
, что правильно, но между входом и выходом есть новая строка, которой не должно быть, и (% o2) поступает из отформатированного вывода Maxima, поэтому его также не должно быть.
Полагаю, мой вопрос теперь сводится к двум вещам:
1) Как исправить вывод, чтобы он был отформатирован без завершающей строки и индикатора вывода?2) Как насчет следующего кода, который я могу исправить?Что я могу сделать лучше?и почему?(Мой код еще не завершен, потому что у меня есть еще один сегмент, который я хочу написать)
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <errno.h>
#include <iostream> // cin, cout
#include <signal.h>
using namespace std;
int main(int argc, char* argv[]){
pid_t pid;
int status;
int count;
int fpipe[2];
string start = "display2d:false$expand("; string end = ");"; string inp, sent;
string quit = "quit();";
string buffer;
if(pipe(fpipe)){cerr<<"Pipe Failure" << endl; exit(1);}
if((pid = fork()) < 0){ cerr<<"Fork Failure"<<endl; exit(2);}
if(pid == 0){ // child process
close(0); // close stdin
dup(fpipe[0]); // copy stdin
close(fpipe[1]);
execlp("maxima", "maxima", "-q", (char*)0);
read(fpipe[0], (void*)buffer.c_str(), buffer.length());
cout << buffer << " 1" << endl;
exit(EXIT_FAILURE);
}
else{
if(argc == 1){ // parent process
//close(fpipe[0]);
close(1); // close stdout
//dup(fpipe[1]); // redirect stdout
while(1){
cout << ">";
cin >> buffer;
if(buffer == "quit"){
break;
}
buffer = start+buffer+end+'\n';
int dp = write(fpipe[1], buffer.c_str(), buffer.length());
//cout << buffer << endl;
waitpid(getpid(), &status, 0);
}
}
else if(argc > 1){ // just do it for # of argc
}
}
return 0;}
Пример ввода и вывода
$. / Expand
> (x + 2) ^ 2
x ^ 2 + 4 * x + 4
Токовый выход
(% o #) x ^2 + 4 * х + 4