标准I/O流、文件描述符与进程通信详解
1. 标准I/O流概述
在程序启动时,会预定义并打开三个流:标准输入(stdin)用于常规输入读取,标准输出(stdout)用于常规输出写入,标准错误(stderr)用于诊断输出写入。其中,stderr打开时不会进行全缓冲;而stdin和stdout仅在与之关联的文件描述符未与交互式设备关联时才会进行全缓冲。
每个流都有一个关联的锁,用于防止多线程访问流时的数据竞争,并限制多线程执行流操作的交错。该锁是可重入的,即单个线程可以在同一时间多次持有该锁。除了以 _unlocked
结尾的函数外,所有读取、写入、定位或查询流位置的函数,在访问流之前都会像调用 flockfile()
一样锁定流,访问完成后像调用 funlockfile()
一样释放锁。
如果锁不能立即获取,函数通常会等待其可用,但在某些情况下除外。例如,当流是行缓冲且以写入或更新模式打开,并且函数尝试锁定流是因为要在另一个无缓冲或行缓冲且需要从主机环境传输字符的流上请求输入时,函数会尝试判断是否存在死锁情况。若存在死锁,函数将失败;若能确定不存在死锁,则等待锁可用;若无法确定是否存在死锁,则继续执行,就好像已经锁定流、发现缓冲区为空并释放了锁一样。
与内存缓冲区关联的流,对文本文件的操作与与外部文件关联的流相同,并且流的方向也以相同的方式确定。通过 fmemopen()
调用与内存缓冲区关联的流,其输入和输出操作受实现限制,必须在内存缓冲区的范围内进行。对于通过 open_memstream()
或