[quote=引用 3 楼 chinaszkk 的回复:] 实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入。这都有可能引起你说的卡死,所以,写入函数在向内存中写入数据之前,检查1、内存中有足够的空间可容纳所有要写入的数据;2、内存没有被读程序锁定(这是内核中是实现的)。感觉在Qt里最好这些通信的都创建一个线程来执行。
实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入。这都有可能引起你说的卡死,所以,写入函数在向内存中写入数据之前,检查1、内存中有足够的空间可容纳所有要写入的数据;2、内存没有被读程序锁定(这是内核中是实现的)。感觉在Qt里最好这些通信的都创建一个线程来执行。
阻塞引起的还是怎么的?
16,247
社区成员
26,663
社区内容
加载中
试试用AI创作助手写篇文章吧