鱼C论坛

 找回密码
 立即注册
查看: 3598|回复: 5

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

[复制链接]
发表于 2017-11-7 09:39:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

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操作,读完管道中的数据以后,就直接阻塞了,还没能返回一个值以跳出循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-7 09:43:04 | 显示全部楼层
不好意思图没发上来,补一下。
pipe问题.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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操作,读完管道中的数据以后,就直接阻塞了,还没能返回一个值以跳出循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 10:02:58 | 显示全部楼层
逄逄 发表于 2017-11-7 09:43
不好意思图没发上来,补一下。

额额额
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-11-7 11:35:24 | 显示全部楼层

emmmm.... 感谢帮顶啦。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-7 12:59:00 | 显示全部楼层
没有人能解答吗。。。
感觉停一会儿就沉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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