Как написать программу на C для запуска исполняемого файла, прочитать ответ, вернуть информацию обратно в исполняемый файл, а затем прочитать ответ исполняемого файла? - PullRequest
0 голосов
/ 10 октября 2019

Я понимаю основы C, но не совсем понимаю, как работают каналы, процессы и т. Д. Я пытаюсь написать программу, которая выполняет другую программу (исполняемая, уже скомпилированная программа Си). Другая программа выводит случайные числа в строке, затем моя программа оценивает их с помощью алгоритма, отправляет оцененное число другой программе, а затем моя программа считывает вывод другой программы на основе вычислений. Я уже написал ту часть программы на C, которая манипулирует строкой, но мне не удалось выполнить ту часть кода, которая взаимодействует с другой программой, потому что я не совсем понимаю, как она работает.

Я пытался реализовать ответ из другого поста: одновременное чтение и запись . Он прекрасно компилируется и работает, но не считывает выходные данные, сгенерированные другой программой. Кроме того, обратите внимание, что функции printf() как раз для меня для отладки.

#include<sys/wait.h>
#include<sys/prctl.h>
#include<signal.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<stdbool.h>

int main(){
  pid_t pid = 0;
  int inpipefd[2];
  int outpipefd[2];
  char firstBuf[512];
  char firstsecondBuf[512];
  char msg[256]="124567891";
  int status;
  pipe(inpipefd);
  pipe(outpipefd);
  pid = fork();
  char numbers[800];
  char resultStr[500];

  if (pid == 0){
    dup2(outpipefd[0], STDIN_FILENO);
    dup2(inpipefd[1], STDOUT_FILENO);
    dup2(inpipefd[1], STDERR_FILENO);
    prctl(PR_SET_PDEATHSIG, SIGTERM);
    execl("file/path/to/program","program",(char*) NULL);
    exit(1);
  }

  close(outpipefd[0]);
  close(inpipefd[1]);

  while(1){
    read(inpipefd[0], firstBuf, 512);

    write(outpipefd[1], resultStr, strlen(resultStr));

    printf("\nReceived numbers and characters: %s \n", firstBuf);

    read(inpipefd[0], firstsecondBuf, 512);
    printf("\nReceived result: %s \n", firstsecondBuf);
    perror("execl /path/to/file/program");
  }

  kill(pid, SIGKILL);
  waitpid(pid, &status, 0);
  return 0;
}

Предполагается, что другая программа даст какой-то ответ на оценку, например "Неправильно" или "Поздравляю", но всеэто говорит что-то вроде «Полученный результат:? j». Есть идеи? Спасибо!

...