linux进程间管道通信问题,为什么子进程写了,子进程的子进程读不到
发布网友
发布时间:2022-09-21 17:03
我来回答
共2个回答
热心网友
时间:2023-11-19 03:13
在 child1 进程中,你把 fd[0] close 掉并设置成-1,这样等child2被fork出来的时候,它所继承的fd[0]也同样是-1,当然无法从中读到任何东西。 改动很简单,把你close(fd[0])的那两行注释掉就行了,参考下面的代码。 更合理的改法是,fork完 child2 后,再在 child1 中close(fd[0]),你可以自行线下实现。
#include<sys/types.h>
#include<unistd.h>
#include<cstring>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
int main(){
int fd[2];
if(pipe(fd)!=0){
std::cout<<"pipe failed"<<std::endl;
exit(0);
}
pid_t pid=fork();
if(pid<0){
std::cout<<"fork failed"<<std::endl;
exit(0);
}else if(pid == 0){
//close(fd[0]);
//fd[0]=-1;
write(fd[1],"XXXXXX",10);
std::cout<<"child1 process"<<std::endl;
}else{
exit(0);
}
std::cout<<"================="<<std::endl;
pid_t pid1=fork();
if(pid1<0){
std::cout<<"fork1 failed"<<std::endl;
exit(0);
}else if(pid1 == 0){
std::cout<<"chiled2 process"<<std::endl;
close(fd[1]);
fd[1]=-1;
char buf[1024]={0};
read(fd[0],&buf,10);
std::cout<<buf<<std::endl;
std::cout<<strlen(buf)<<std::endl;
}else{
exit(0);
}
return 0;
}
热心网友
时间:2023-11-19 03:14
你可以试着在子进程创建管道,在孙子进程读管道。