Мне нужно решить эту проблему: установить двустороннее общение с родителями, где дети фильтруются (сделано в с).Вам необходимо отправить имя файла родителю, затем родительское имя отправить по каналу дочерним элементам, после чего дочерние элементы применяют фильтр и отправляют результат родителю через канал.Я делаю фильтр в C `
char * readline(FILE *fp, char *buffer){
int ch;
int i = 0;
size_t buff_len = 0;
buffer = malloc(buff_len + 1);
if (!buffer){
return NULL;
}
while ((ch = fgetc(fp)) != '\n' && ch != EOF)
{
buff_len++;
void *tmp = realloc(buffer, buff_len + 1);
if (tmp == NULL){
free(buffer);
return NULL;
}
buffer = tmp;
buffer[i] = (char) ch;
i++;
}
buffer[i] = '\0';
if (ch == EOF && (i == 0 || ferror(fp)))
{
free(buffer);
return NULL;
}
return buffer;
}
void reverse_string(char *s){
int len = strlen(s), k, count = 0;
char tmp;
for(int i = 0, j = 0; j < len; j++){
if(!isalnum(s[j]) || (j == len - 1)){
if(j < len - 1){
k = j - 1;
}
else {
k = j;
}
if(count == 1){
while(i < k){
tmp = s[i];
s[i] = s[k];
s[k] = tmp;
i++;
k--;
count--;
}
}
else {
count++;
}
i = j + 1;
}
}
}
void lineByline(FILE * file){
char *s;
int g;
while ((s = readline(file, 0)) != NULL){
reverse_string(s);
puts(s);
free(s);
}
}
int main(int argc, char ** argv)
{
FILE* file = fopen(argv[1], "r");
if (file){
lineByline(file);
} else {
perror("Can't open file");
exit(-1);
}
return 0;
}`
Я пытаюсь сделать односторонний конвейер, и он работает, но у меня нет идеи, как сделать двусторонний конвейер ...