Работя върху задача, в която имам нужда от няколко процеса (родител и деца), за да комуникирам. Родителят изпраща файлови пътеки на децата и те трябва да стартират 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
на file1\nfile2\n (забележете използваните флагове -n -f-) в цикъл от 3 итерации, очаквайки да получа шест реда, но получавам само три:
file1: ГРЕШКА: не може да отвори `file1' (няма такъв файл или директория)
file2: ГРЕШКА: не може да отвори `file2' (няма такъв файл или директория)
file1: ГРЕШКА: не може да отвори `file1' (няма такъв файл или директория)
Когато не пренасоча изхода на детето към канала (оставя го да пише в std_out), получавам всичките шест реда.
Всяка помощ ще бъде оценена.