linux阻塞和非阻塞(linux阻塞与非阻塞)-编程之家

linux阻塞指令?

1.阻塞(block)概念:指进程或线程在执行设备操作或管道,或则网络时,不能获取到资源就被挂起,

直到满足可操作的条件后在进行操作,被挂起的进程进入休眠状态,从运行队列移走,直到

等待的条件满足才继续执行。也就是执行到某些函数时必须等待某个事件发生函数才返回。

2.非阻塞(non_block):进程就算没有获取到资源或没有等到事件发生时不挂起,通常会直接放弃或不断查询,

直到可以进行的位置。也就是函数的执行不必等待事件发生,一旦执行肯定返回,用返回值来反应函数执行情况。

3.例如:read读取输入输出设备/dev/tty

4.read设备文件时发生阻塞

linux accept()函数一直处于阻塞状态,什么原因?

accept()函数就是阻塞的啊,要等待接收到有客户端请求才可以进行后续的操作,你所谓的不可以是指什么?

Linux下read函数默认到底是阻塞的还是非阻塞的?

不知题主的read是指socket的read还是文件的read。

默认情况下,socket的read是阻塞的; 对文件进行read,要看内核态的read接口是注册为同步接口还是异步接口(可参见file_operations结构体)

线程进入阻塞时,线程会不会让出CPU?

那要看操作系统context switch的机制。一般windows linux ios都会给定每个线程指定的执行时间,如果时间到了会出现计时器中断信号(timer interrupt signal),而线程会被动丢失CPU的使用权。

而有些简单的嵌入式系统没有这个机制,context switch一般是要求线程主动放弃CPU使用权而交给kernel。

如果这时候当前线程被阻塞那就会导致死循环,这时候要主动的叫reschedule 或者 yield等函数给kernel发信号。

当然有timer的系统也可以叫这些函数要当前线程提早主动放弃CPU资源从而避免在循环里等待浪费时间。

linux串口读取数据被截断,怎样一次全部接收?

没办法保证能够一次全部接收,只能自己缓存起来处理。比如,发送数据时候增加带有长度的数据头以及末尾的校验,用 select 对串口做非阻塞读取,读到数据后检查是否完整,不完整就接着读,直到获得完整数据再处理。