父子进程的匿名管道
-
- 代码
-
#include <stdio.h>
#include <unistd.h>
int main(){
int fd[2];
int ret=pipe(fd);
if(ret<0){
perror("pipe:");
}
//管道创建成功
pid_t pid=fork();
if(pid < 0){
perror("fork:");
return 0;
}
else if(pid == 0){
//child
printf("i an child process\n");
printf("fd[0]=%d fd[1]=%d\n",fd[0],fd[1]);
}
else{
//father
printf("i am father process\n");
printf("fd[0]=%d fd[1]=%d\n",fd[0],fd[1]);
}
while(1){
sleep(1);
}
return 0;
}
-
- 父进程写,子进程读
-
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
int fd[2];
int ret=pipe(fd);
if(ret<0){
perror("pipe:");
}
//管道创建成功
pid_t pid=fork();
if(pid < 0){
perror("fork:");
return 0;
}
else if(pid == 0){
//child
printf("i am child process\n");
printf("fd[0]=%d fd[1]=%d\n",fd[0],fd[1]);
char buf[1024];
read(fd[0],buf,sizeof(buf)-1);
printf("child:%s\n",buf);
}
else{
//father
printf("i am father process\n");
printf("fd[0]=%d fd[1]=%d\n",fd[0],fd[1]);
char content[]="study hard";
write(fd[1],content,strlen(content));
}
return 0;
} -
- 父子进程匿名管道的读写两端的引用计数为2,父进程的读端关闭后,管道读端的引用计数变为1,子进程的写端关闭后,管道写端的引用计数变为1,因此父进程写,子进程读是可以正常进行的。
-
|