非阻塞方式读管道

1。fcntl(fd[0],   F_SETFL,   O_NONBLOCK)

2。在open的时候,传入O_NONBLOCK参数,按非阻塞方式打开

3。可以用select函数,

4

int flag=fcntl(fd,F_GETFL,0);
flag |= O_NONBLOCK;
if(fcntl(fd,F_SETFL,flag) < 0){
   perror("fcntl");
   exit(1);
}


取消非阻塞:

flag&=~O_NONBLOCK
~O_NONBLOCK   对该值取反
然后再同flag进行“位与”,最终结果是从flag中清除O_NONBLOCK标志

flag=flag&(~O_NONBLOCK);

flag&=~O_NONBLOCK
~O_NONBLOCK   对该值取反
然后再同flag进行“位与”,最终结果是从flag中清除O_NONBLOCK标志


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unix/Linux系统中,管道(pipe)是内核提供的一种半连接通信机制,它允许进程间通过文件描述符(file descriptor, fd)进行数据交换。当管道的fd设置为阻塞或非阻塞模式,会影响到写操作的行为。 **阻塞模式(Blocking):** 当fd设置为阻塞模式时,如果试图从管道取数据但管道为空(没有数据),或者向管道写入数据但管道已满,操作系统会将调用该操作的线程挂起,直到有数据可或空间可用。阻塞模式保证了数据的一致性,适合于处理顺序执行、不需要立即响应的情况。 **非阻塞模式(Non-blocking):** 在非阻塞模式下,同样的操作会立即返回,如果管道没有数据或空间,操作系统不会阻塞,而是直接返回错误,如`EAGAIN`(资源暂时不可用)。这使得进程能够更高效地处理并发,因为线程不会因等待IO而阻塞其他操作,适用于事件驱动或高并发场景,但需要程序自行管理IO状态和错误检查。 设置阻塞和非阻塞的主要差别在于性能、可扩展性和应用程序的复杂性: 1. **性能**:非阻塞模式通常更快,因为它减少了不必要的线程阻塞,提高了系统的吞吐量。 2. **并发能力**:非阻塞模式支持高并发,因为多个线程可以同时尝试进行I/O操作,而阻塞可能导致线程竞争同一资源。 3. **代码复杂性**:非阻塞模式需要更多的错误检查和同步逻辑,否则可能会导致数据丢失或死锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值