Я работаю над заданием, в котором мне нужно несколько процессов (родительский и дочерний) для общения. Родитель отправляет пути к файлам детям, и они должны запустить на них linux file
(/usr/bin/file), возвращая вывод отцу.
На данный момент я все еще пытаюсь заставить одного ребенка работать, так что пока я предполагаю, что есть один ребенок.
Я собираюсь отправить несколько путей к файлам каждому ребенку (пакет файлов), а затем прочитать вывод file
.
Проблема:
Я использую цикл для write
нескольких путей к файлам, но когда я read
выходной канал дочернего элемента, я не получаю весь вывод, который должен.
Код:
#define Read 0
#define Write 1
#define ParentRead read_pipe[0]
#define ParentWrite write_pipe[1]
#define ChildRead write_pipe[0]
#define ChildWrite read_pipe[1]
#define PIPE_BUF_LEN 4096
using namespace std;
int main()
{
/** Pipe for reading for subprocess */
int read_pipe[2];
/** Pipe for writing to subprocess */
int write_pipe[2];
char buffer[PIPE_BUF_LEN] = "";
if (pipe(read_pipe) == 0 && pipe(write_pipe) == 0)
{
pid_t pid = fork();
if (pid == -1)
{
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
else if (pid == 0) //Child process
{
close(ParentRead);
close(ParentWrite);
dup2 (ChildRead, STDIN_FILENO); /*redirect ChildRead to stdin*/
dup2 (ChildWrite, STDOUT_FILENO); /*redirect stdout to ChildWrite*/
char* paramArgs[]={"/usr/bin/file","-n","-f-",NULL};
execv("/usr/bin/file",paramArgs);
exit(EXIT_FAILURE);
}
else { //Parent process
close(ChildRead);
close(ChildWrite);
for (int i=0; i < 3 ;i++)
{
/*write to processes which are ready for writing: */
fd_set rfds;
int retval;
FD_ZERO(&rfds);
FD_SET(ParentWrite, &rfds);
retval = select(10, NULL, &rfds, NULL, NULL);
if (retval == -1)
{
perror("select()");
}
else if (retval)
{
write(ParentWrite, "file1\nfile2\n", 12);
}
/*read from processes which are ready for reading*/
FD_ZERO(&rfds);
FD_SET(ParentRead, &rfds);
retval = select(10, &rfds, NULL, NULL, NULL);
if (retval == -1)
{
perror("select()");
}
else if (retval)
{
read(ParentRead, buffer, PIPE_BUF_LEN);
cout << buffer;
}
}
}
}
exit(EXIT_SUCCESS);
}
В этом случае я пытаюсь запустить file
для файла1\nфайл2\n (обратите внимание на используемые флаги -n -f-) в цикле из 3 итераций, ожидая получить шесть строк, но получаю только три:
файл1: ОШИБКА: невозможно открыть «файл1» (нет такого файла или каталога)
файл2: ОШИБКА: невозможно открыть «файл2» (нет такого файла или каталога)
файл1: ОШИБКА: невозможно открыть «файл1» (нет такого файла или каталога)
Когда я не перенаправляю вывод дочернего элемента в канал (позволяя ему писать в std_out), я получаю все шесть строк.
Любая помощь будет оценена.