Двухсторонний канал связи в Linux - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно решить эту проблему: установить двустороннее общение с родителями, где дети фильтруются (сделано в с).Вам необходимо отправить имя файла родителю, затем родительское имя отправить по каналу дочерним элементам, после чего дочерние элементы применяют фильтр и отправляют результат родителю через канал.Я делаю фильтр в 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;
}`

Я пытаюсь сделать односторонний конвейер, и он работает, но у меня нет идеи, как сделать двусторонний конвейер ...

...