所以你需要一个双向管道。
管道是 ipc 的单向方法,但您可以使用两个管道轻松创建双向管道。
现在要创建一个管道,您可以使用 pipe() 函数(https://linux.die.net/man/2/pipe 用于文档)。
我可以给你一些关于 pipe() 的信息,第一个参数是一个两个字段的 int 数组,如果管道返回一个不同于 -1 的值,则调用成功终止,并且在这个数组的位置 0 你有一个文件描述符,你可以使用 read 读取管道的内容,在位置 1 可以使用 write 在管道上写入。
前段时间我写了一个双向管道的练习,所以我可以给你这个代码作为一个例子,但当然要阅读文档并了解什么是管道等等。
#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;
}