逄逄 发表于 2017-11-7 09:39:14

关于linux下用pipe实现文件拷贝

我还不太明白怎么把虚拟机里的代码文件导出来,所以就截了重点。各位见谅。
http://bbs.fishc.com/template/dreambred_c_apple/images/common//emp.gif
这是我fork()完子进程以后的代码。
我想请问为什么父进程里面要用while,反复读文件,以保证源文件读完。
但是子进程里面,用while反复读pipe,再写到目标文件,程序就会死循环呢?
像这里我是子进程只做了一次读操作,但是运行的结果却是成功拷贝了!
我很不解,这样不会出现子进程把现在管道里的读走了,然后父进程又写进来了一些,子进程就没读到后面的部分这样的情况吗??

逄逄 发表于 2017-11-7 09:43:04

不好意思图没发上来,补一下。

逄逄 发表于 2017-11-7 17:02:06

这个问题我已经解决了。

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

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

我犯的错误就是这里说的第2,
因为wait使父进程挂起等待子进程结束,没有关闭写端,也就是有人写,只是没写。
这时在子进程中的while(read````)就进行了read操作,读完管道中的数据以后,就直接阻塞了,还没能返回一个值以跳出循环。

飞非妃飞飞 发表于 2017-11-7 10:02:58

逄逄 发表于 2017-11-7 09:43
不好意思图没发上来,补一下。

额额额

逄逄 发表于 2017-11-7 11:35:24

飞非妃飞飞 发表于 2017-11-7 10:02
额额额

emmmm.... 感谢帮顶啦。。

逄逄 发表于 2017-11-7 12:59:00

没有人能解答吗。。。
感觉停一会儿就沉了
页: [1]
查看完整版本: 关于linux下用pipe实现文件拷贝