什么是阻塞和非阻塞?

描述

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

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

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

 

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

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

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

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

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

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

审核编辑:刘清

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分