c - 使用 2 个管道时同步父子节点
问题描述
这是我的代码的目的:
孩子应该:
1. 向父母发送一个字符
2. 从父母那里接收整数并打印它
父母应该:
1. 读取孩子发送的字符并打印
2. 将其转换为整数并将结果发送给孩子
这是我写的代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>
int main()
{
int fd1[2];
int fd2[2];
pid_t p;
if (pipe(fd1)==-1)
{
fprintf(stderr, "Pipe Failed" );
return 1;
}
if (pipe(fd2)==-1)
{
fprintf(stderr, "Pipe Failed" );
return 1;
}
p = fork();
if (p<0)
{
fprintf(stderr, "fork Failed" );
return 1;
}
if (p==0){
char c='a';
int received;
close(fd1[0]);
write(fd1[1], c, sizeof(char));
close(fd1[1]);
close(fd2[1]);
read(fd2[0], received, sizeof(int));
printf("Printing from child ");
printf(" ");
printf("%d", received);
close(fd2[0]);
}
if (p >0)
{
char received;
close(fd1[1]);
read(fd1[0], received, sizeof(char));
printf("Printing from parent ");
printf(" ");
printf("%c", received);
close(fd1[0]);
close(fd2[0]);
int test=(int)received;
write(fd2[1], test, sizeof(test));
close(fd2[1]);
}
}
我当前的输出如下:从父打印从子打印 0
我假设父母在孩子写入之前从管道中读取,如何解决这个问题?
解决方案
我假设父母在孩子写入之前从管道中读取,如何解决这个问题?
这个假设是错误的。该错误是一个好的编译器应该警告的错误-您错过的不是变量的值c
,received
而是test
必须传递给write
and read
,而是它们的地址:
write(fd1[1], &c, sizeof(char));
…
read(fd2[0], &received, sizeof(int));
…
read(fd1[0], &received, sizeof(char));
…
write(fd2[1], &test, sizeof(test));
请问计算机如何确保我假设的情况不会发生?
与终端设备一样,来自管道的read
from 只是阻塞,直到有东西要读取(前提是文件描述符没有显式设置为非阻塞)。
推荐阅读
- c# - 如何解决错误 CS1525 Invalid expression term '='?
- python - 空图...使用 for 循环创建图
- spring-boot - 如何在 Postman 中设置 CSRF 令牌
- flutter - BlocProvider.of() 使用不包含 Bloc 的上下文调用 - 即使它包含
- objective-c - Xcode 11 Objective C++ - 无法在 ObjectiveC++ 项目中将实现与标头分开
- javascript - 如何使用javascript在两个菜单项之间切换?
- python - 使用带有 Windows 身份验证的 python 建立 SQL Server 数据库连接
- android - onPress 处理程序未通过 Android 上的 TouchableHighlight 触发
- python - 如何在使用函数时加快处理速度
- javascript - 将按钮的值发送到另一个 html 页面中的表格单元格