pipe 使用问题

◐_◑ ◐_◑ 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在学习管道,代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#define K 1024
#define writelen (12*K)
int main(){
int result = -1;
int fd[2],nbytes;
char string [writelen] = "你好,管道~!";
char readbuffer[10*K];
int * write_fd = &fd[1];
int * read_fd = &fd[0];

result = pipe(fd);
if(-1 == result){
printf("管道建立失败~!\n");
return -1;
}
int pid = fork();
if( -1 == pid ){
printf("fork 进程失败\n");
return -1;
}
if(0 == pid){
int write_size = writelen;
printf("pid[%d] write_size is [%d]i\n",getpid(),write_size);
result = 0;
close(*read_fd);
while(write_size > 0){
result = write(*write_fd,string,write_size);
printf("pid[%d] result is [%d]i\n",getpid(),result);
if(result > 0){
write_size -= result;
printf("pid[%d] 写入 %d 个数据, 剩余 %d 个数据\n",getpid(), result, write_size);
} else {
printf("pid[%d] sleep ----\n",getpid());
sleep(10);
}
}
printf("pid[%d] : 退出 \n",getpid());
return 0;
} else {
close(*write_fd);
printf("pid[%d] i---------------------\n",getpid());
while(1) {
printf("pid[%d] i---------------------\n",getpid());
nbytes = read(*read_fd,readbuffer,sizeof(readbuffer));
if(nbytes <= 0){
printf("pid[%d] 没有数据写入 \n",getpid());
break;
}
printf("pid[%d] : 接收到%d个数据,内容为:\"%s\" \n",getpid(),nbytes,readbuffer);
}
printf("pid[%d] : 退出 \n",getpid());
return 0;
}
return 0;
}


运行结果如下:
pid[3502] i---------------------
pid[3502] i---------------------
pid[3503] write_size is [12288]i
pid[3502] : 接收到10240个数据,内容为:"你好,管道~!"
pid[3502] i---------------------
pid[3502] : 接收到2048个数据,内容为:""
pid[3502] i---------------------
pid[3503] result is [12288]i
pid[3503] 写入 12288 个数据, 剩余 0 个数据
pid[3503] : 退出
pid[3502] 没有数据写入
pid[3502] : 退出

问题是 我不知道 为什么 代码中 需要 close 操作,我试着把 close 代码 注释掉 运行结果如下:

pid[3504] i---------------------
pid[3504] i---------------------
pid[3505] write_size is [12288]i
pid[3504] : 接收到10240个数据,内容为:"你好,管道~!"
pid[3504] i---------------------
pid[3504] : 接收到2048个数据,内容为:""
pid[3504] i---------------------
pid[3505] result is [12288]i
pid[3505] 写入 12288 个数据, 剩余 0 个数据
pid[3505] : 退出

然后 到这是就阻塞等待了, 有哪位大神 可以帮小弟解答一下啊,感激不尽,谢谢了~!
...全文
评论 2
收藏 已收藏
分享
返回顶部
◐_◑
Linux/Unix社区 23,224 成员 74,535 内容