Я понимаю основы 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». Есть идеи? Спасибо!