QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

VIP至尊会员

Rank: 15Rank: 15Rank: 15

积分
131
查看: 134|回复: 5

[已解决]关于linux下用pipe实现文件拷贝

[复制链接]
最佳答案
3 
累计签到:52 天
连续签到:2 天
逄逄 发表于 2017-11-7 09:39:14 1345 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我还不太明白怎么把虚拟机里的代码文件导出来,所以就截了重点。各位见谅。

                               
登录/注册后可看大图

这是我fork()完子进程以后的代码。
我想请问为什么父进程里面要用while,反复读文件,以保证源文件读完。
但是子进程里面,用while反复读pipe,再写到目标文件,程序就会死循环呢?
像这里我是子进程只做了一次读操作,但是运行的结果却是成功拷贝了!
我很不解,这样不会出现子进程把现在管道里的读走了,然后父进程又写进来了一些,子进程就没读到后面的部分这样的情况吗??
最佳答案
2017-11-7 17:02:06
这个问题我已经解决了。

大家可以注意到我的截图,最后wait( )函数,写在了close(fd[1])(也就是父进程关闭写端)之前。

补充一些pipe函数的知识:
管道的读写行为:
1. 如果管道写端都已关闭(确认没人写),仍有读端存在,那么管道剩余数据被读完后,再次read,返回0
2. 如果写端没有关闭(有人写,只是没写),读端仍存在且在进行读取,那么管道剩余数据读取后,再次read会阻塞
3. 读端都已关闭(确认没人读),有写端向管道write,进程会收到信号SIGPIPE,通常进程因此异常终止,当然也可以对此异常信号进行捕获,进行别的处理。
4.读端没有都关闭(有人读,只是没读),这时有写端向管道write, 管道被写满后,再次write会阻塞

我犯的错误就是这里说的第2,
因为wait使父进程挂起等待子进程结束,没有关闭写端,也就是有人写,只是没写。
这时在子进程中的while(read````)就进行了read操作,读完管道中的数据以后,就直接阻塞了,还没能返回一个值以跳出循环。
楼层
跳转到指定楼层
最佳答案
3 
累计签到:52 天
连续签到:2 天
逄逄  楼主| 发表于 2017-11-7 09:43:04 | 显示全部楼层
不好意思图没发上来,补一下。
pipe问题.PNG
最佳答案
3 
累计签到:52 天
连续签到:2 天
逄逄  楼主| 发表于 2017-11-7 17:02:06 | 显示全部楼层    本楼为最佳答案   
这个问题我已经解决了。

大家可以注意到我的截图,最后wait( )函数,写在了close(fd[1])(也就是父进程关闭写端)之前。

补充一些pipe函数的知识:
管道的读写行为:
1. 如果管道写端都已关闭(确认没人写),仍有读端存在,那么管道剩余数据被读完后,再次read,返回0
2. 如果写端没有关闭(有人写,只是没写),读端仍存在且在进行读取,那么管道剩余数据读取后,再次read会阻塞
3. 读端都已关闭(确认没人读),有写端向管道write,进程会收到信号SIGPIPE,通常进程因此异常终止,当然也可以对此异常信号进行捕获,进行别的处理。
4.读端没有都关闭(有人读,只是没读),这时有写端向管道write, 管道被写满后,再次write会阻塞

我犯的错误就是这里说的第2,
因为wait使父进程挂起等待子进程结束,没有关闭写端,也就是有人写,只是没写。
这时在子进程中的while(read````)就进行了read操作,读完管道中的数据以后,就直接阻塞了,还没能返回一个值以跳出循环。
最佳答案
0 
累计签到:3 天
连续签到:1 天
飞非妃飞飞 发表于 2017-11-7 10:02:58 | 显示全部楼层
逄逄 发表于 2017-11-7 09:43
不好意思图没发上来,补一下。

额额额
最佳答案
3 
累计签到:52 天
连续签到:2 天
逄逄  楼主| 发表于 2017-11-7 11:35:24 | 显示全部楼层

emmmm.... 感谢帮顶啦。。
最佳答案
3 
累计签到:52 天
连续签到:2 天
逄逄  楼主| 发表于 2017-11-7 12:59:00 | 显示全部楼层
没有人能解答吗。。。
感觉停一会儿就沉了

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-25 19:17

快速回复 返回顶部 返回列表