Пишу небольшую утилиту для тестирования для своих нужд и чтобы разобраться в механизмах работы с потоками ввода вывода. Функционал программы примерно следующий:
- Запустить дочерный процесс, в котором несколько раз требуется что-то ввести в стандартный ввод(STDIN) и на этот ввод программа реагирует выводом в стандартный вывод(STDOUT)
- Записать данные в стандартный ввод дочернего процесса (STDIN)
- Считать данные из стандартного вывода дочернего процесса (STDOUT)
- Перейти на шаг 2
Примерный код:
main.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
void error(char *s);
char *data[2] = {"hello. How are you?\n", "lacrimosa\n"};
int main(void) {
int in[2], out[2], n, pid;
char buf[255];
if (pipe(in) < 0) error("pipe in");
if (pipe(out) < 0) error("pipe out");
if ((pid = fork()) == 0) {
/* This is the child process */
/* Close stdin, stdout, stderr */
close(0);
close(1);
close(2);
/* make our pipes, our new stdin,stdout and stderr */
dup2(in[0], 0);
dup2(out[1], 1);
dup2(out[1], 2);
close(in[1]);
close(out[0]);
close(in[0]);
close(out[1]);
execl("/bin/sh", "sh", "-c", argv[1], (char *)NULL);
error("Could not exec hexdump");
}
/* This is the parent process */
close(in[0]);
close(out[1]);
for (int i = 0; i < 2; i++) {
printf("<- %s", data[i]);
/* Write some data to the childs input */
write(in[1], data[i], strlen(data[i]));
/* Read back any output */
n = read(out[0], buf, 250);
buf[n] = 0;
printf("-> %s", buf);
// Анализируем вывод дочернего процесса.
}
wait(NULL);
exit(0);
}
void error(char *s) {
perror(s);
exit(1);
}
sample.c:
#include <stdio.h>
int main(inc argc, char *argv[]) {
char buf[1024];
for (int i = 0; i < 5; i++) {
scanf("%s", buf);
if (strstr(buf, "hello")) {
printf("Hello!\n");
} else {
printf("Bye!\n");
}
}
return 0;
}
Проблема возникает, когда пытаюсь считать данные из потока вывода (STDOUT), потому что программа блокируется не доходя до туда. В примерах советуют просто закрыть поток ввода(STDIN), вот только проблема в том, что мне необходимо дальше записывать в него какие-то данные. Буду также крайне признателен, если поделитесь ссылкой на какие-либо материалы по теме pipes и межпроцессорного взаимодействия. Спасибо.
P.S. Я ввидимо ввел вас содержанием программы. Эта программа является просто примером выполняемых мной действий и не имеет отношение к реальному проекту. (Я не буду использовать hexdump
). Поэтому я отредактировал код.
P.S. 2 Прилагаю ссылку на репозиторий, чтобы уже совсем понятно стало, что я пытаюсь сделать:
https://github.com/pro100ren4/mtest
c, development, linux, pipes