Итак, вам нужна двунаправленная труба. Труба - это однонаправленный метод ip c, но вы можете легко создать двунаправленную трубу, используя две трубы. Теперь для создания трубы вы используете функцию pipe () (https://linux.die.net/man/2/pipe для документации). Я могу дать вам некоторую информацию о pipe (), первый аргумент - это массив из двух полей, если канал возвращает значение, отличное от -1, вызов завершается успешно, и в позиции 0 этого массива у вас есть файловый дескриптор, где вы можно использовать read для чтения содержимого канала, а в позиции 1 вы можете использовать write для записи в канал. Некоторое время go я пишу для упражнения двунаправленную трубу, чтобы я мог дать вам этот код в качестве примера, но, конечно, прочитайте документацию и поймите, что такое труба и так далее.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
#include <sys/wait.h>
int
main(void){
int parents_fields[2];
int child_fields[2];
int parent_char;
int child_char;
char char_to_write;
setbuf(stdout,NULL);
if(pipe(parents_fields) == -1){
perror("pipe() : parent_fields");
exit(EXIT_FAILURE);
}
if(pipe(child_fields) == -1){
perror("pipe() : child_fields");
exit(EXIT_FAILURE);
}
switch(fork()){
case -1: // In case of error
perror("fork() failed, terminating the program");
exit(EXIT_FAILURE);
case 0: // Child
// Closing unused file descriptors
if(close(parents_fields[1]) == -1){
perror("Child: Error closing parents_fields[1], terminatin the program");
exit(EXIT_FAILURE);
}
if(close(child_fields[0]) == -1){
perror("Child: Error closing child_fields[0], terminatin the program");
exit(EXIT_FAILURE);
}
if(read(parents_fields[0],&parent_char,1) == -1){
perror("Child: Error reading the parent pipe, terminating the program");
exit(EXIT_FAILURE);
}
printf("%c\n",parent_char);
parent_char = toupper(parent_char);
printf("%c\n",parent_char);
if(write(child_fields[1],&parent_char,1) == -1){
printf("Child: Error reading the child pipe, terminating the program , %d , %d",child_fields[1],errno);
exit(EXIT_FAILURE);
}
_exit(EXIT_SUCCESS);
break;
default: //parent
scanf("%c",&char_to_write);
// Closing unused file descriptors
if(close(parents_fields[0] == -1)){
perror("Parent: Closing parents_fields[0], terminating the program...");
exit(EXIT_FAILURE);
}
if(close(child_fields[1]) == -1){
printf("Parent: Error closing child_fields[1], terminatin the program, %d",child_fields[1]);
exit(EXIT_FAILURE);
}
if(write(parents_fields[1],&char_to_write,1) == -1){
perror("Parent: Error writing on parent pipe");
exit(EXIT_FAILURE);
}
if(read(child_fields[0],&parent_char,1) == -1){
perror("Child: Error reading the child pipe, terminating the program");
exit(EXIT_FAILURE);
}
printf("%c\n",parent_char);
_exit(EXIT_SUCCESS);
break;
}
return 0;
}