0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是阻塞和非阻塞?

学益得智能硬件 来源:学益得智能硬件 2024-03-25 10:04 次阅读

什么是阻塞和非阻塞?我们就用管道的读写来举例子。

如果没听过管道,就把他理解成文件就行。

一个程序打开管道,并且往管道里面写入数据;

intmain()
{
intfd=open("fifo",O_WRONLY);
if (-1 == fd)
{
    perror("open");
}

char buf[32] = {0};
scanf("%s", buf);

if (write(fd, buf, strlen(buf)) == -1)
{
    perror("write");
}

    return 0;
}
另一个程序打开管道,从管道里面读取数据。
int main()
{
intfd=open("fifo",O_RDONLY);
    if (-1 == fd)
    {
        perror("open");
    }
    
charbuf[32]={0};
    
    if (read(fd, buf, sizeof(buf)) == -1)
    {
        perror("write");
    }
    
    return 0;
}
默认情况下,用open打开管道是阻塞的模式,也就是说,如果管道没有数据,程序一直停在 read 函数这里,直到管道里面有数据,把它读出来。

创建一个管道,运行程序,现象就是这样的,程序此时阻塞在 read 函数。

如果通过写进程往管道里面写入数据,read能立马把数据读出来。

open函数还给我们提供了非阻塞的模式,加上这个选项,运行程序的时候,即使管道里面没有数据,程序也不会停在 read 函数上,继续向下执行。

这两个现象,就是阻塞和非阻塞。

最后,放上百科的一段解释,大家还有什么见解,欢迎在评论区交流。
阻塞和非阻塞指的是调用者(程序)在等待返回结果(或输入)时的状态。
阻塞时,在调用结果返回前,当前线程会被挂起,并在得到结果之后返回。
非阻塞时,如果不能立刻得到结果,则该调用者不会阻塞当前线程。
因此对应非阻塞的情况,调用者需要定时轮询查看处理状态。


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 阻塞
    +关注

    关注

    0

    文章

    24

    浏览量

    8044

原文标题:什么是阻塞和非阻塞

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Verilog语言中阻塞和非阻塞赋值的不同

    来源:《Verilog数字系统设计(夏宇闻)》 阻塞和非阻塞赋值的语言结构是Verilog 语言中最难理解概念之一。甚至有些很有经验的Verilog 设计工程师也不能完全正确地理解:何时使用非阻塞
    的头像 发表于 08-17 16:18 6149次阅读

    Verilog阻塞阻塞原理分析

    Verilog阻塞阻塞原理分析在Verilog语言最难弄明白的结构中“阻塞赋值”要算一个。甚至是一些很有经验的工程师也不完全明白“
    发表于 11-23 12:02

    linux串口通信阻塞阻塞问题。

    一般情况下串口通信中read()函数都是阻塞的。当然也可以通过设置文件等方法把串口设为阻塞的。这里就有一个问题,当串口设置为阻塞状况下,如果读不到数据程序应该挂起。这种所谓的读不到数
    发表于 07-14 15:57

    verilog中的阻塞阻塞

    这个是非阻塞赋值,b的值为0,仿真结果也是0module TOP(input clk,input rst,output reg b );reg a,c;always@(posedge clk or negedge rst)beginif(~rst)begina
    发表于 09-13 15:55

    【分享】Verilog中阻塞阻塞语句

    同了在第一个clk上升沿到来时,由于b的值未知,赋给c之后,c也为未知值;紧接着,把a的值给b,由于a的值已经给出,所以,结束之后,a、b的值相同,c为x。综合之后,生成两级移位寄存器。 关于阻塞
    发表于 11-03 20:26

    fpga基础篇(一):阻塞阻塞赋值

    `阻塞阻塞赋值首先从名字上理解,阻塞赋值即赋值没完成,后边的语句将无法执行,阻塞刚好与其相
    发表于 04-05 09:53

    阻塞(=)与阻塞(<=)介绍

    语句的执行,延迟后才执行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。 阻塞赋值操作符用小于等于号(即
    发表于 07-03 10:23

    阻塞(=)与阻塞(<=)介绍

    语句的执行,延迟后才执行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。 阻塞赋值操作符用小于等于号(即
    发表于 07-09 05:08

    阻塞阻塞I/O

    里面,因为硬件资源获得的同时往往伴随着一个中断。 注意:驱动程序需要提供阻塞(等待队列,中断)和阻塞方式(轮询,异步通知)访问设备。 休眠(被阻塞)的进程处于一个特殊的不可执行状态。
    发表于 07-09 08:19

    同步与异步,阻塞阻塞的区别是什么

    同步与异步,阻塞阻塞的区别
    发表于 01-26 06:12

    阻塞阻塞赋值的区别是什么?

    本文通过Verilog事件处理机制,详细讨论了阻塞阻塞赋值的区别、联系及其应用示例。
    发表于 05-10 06:59

    深入理解阻塞和非阻塞赋值

    这是一个很好的学习阻塞和非阻塞的资料,对于FPGA的学习有很大帮助。
    发表于 04-22 11:00 11次下载

    深入分析verilog阻塞和非阻塞赋值

    学verilog 一个月了,在开发板上面写了很多代码,但是始终对一些问题理解的不够透彻,这里我们来写几个例子仿真出阻塞和非阻塞的区别
    发表于 02-11 03:23 1237次阅读

    《Linux设备驱动开发详解》第8章、Linux设备驱动中的阻塞与非阻塞IO

    《Linux设备驱动开发详解》第8章、Linux设备驱动中的阻塞与非阻塞IO
    发表于 10-27 11:35 9次下载
    《Linux设备驱动开发详解》第8章、Linux设备驱动中的<b class='flag-5'>阻塞</b>与非<b class='flag-5'>阻塞</b>IO

    网络IO模型:阻塞与非阻塞

    阻塞 IO 模型 在Linux ,默认情况下所有的 socket 都是阻塞的,一个典型的读操作流程如图所示。 阻塞和非阻塞的概念描述的是用户线程调用内核 IO 操作的方式:
    的头像 发表于 10-08 17:16 588次阅读
    网络IO模型:<b class='flag-5'>阻塞</b>与非<b class='flag-5'>阻塞</b>