IPC с использованием неназванных каналов - PullRequest
0 голосов
/ 06 октября 2018

Прежде всего, Привет и спасибо за вашу помощь!

Я пытаюсь понять 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

...