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

在非阻塞模式上怎么知道recv接收数据完成?

linux下 tcp socket编程为例:阻塞就是 recv/read的时候 socket接收缓冲区要是有数据就读, 没数据我就一直睡觉赖着不走,直到有数据来了读完我才走。

send/write的时候,要是发送缓冲区满了,没有空间继续发送了我也一直睡觉赖着不走,直到发送缓冲区腾出足够的空间让我把数据全部塞到发送缓冲区里我才走。

(当然如果你通过setsockopt设置了读写超时,超时时间到了还是会返回-1和EAGAIN,不再睡觉等待)

非阻塞就是recv/read的时候,要是接收缓冲区有数据我就读完,没有数据我直接带着返回的-1和EGAIN走人,绝不睡觉等待耽误时间。

write/send的时候, 要是发送缓冲区有足够的空间,就立刻把数据塞到发送缓冲区去,然后走人,如果发送缓存区满了,空间不足,那直接带着返回的-1和EAGAIN走人。至于IO多路复用,首先要理解的是,操作系统为你提供了一个功能,当你的某个socket接收缓存区有数据可读,或者发送缓冲区有空间可写的时候,它可以给你一个通知。

这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1和EAGAIN的无用功。

写操作类似。

操作系统的这个功能通过select/poll/epoll之类的系统调用函数来使用,这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程。至于事件驱动,其实是I/O多路复用的一个另外的称呼。至于异步同步,我们常见的linux下的网络编程模型大部分都是同步io,以读操作为例,本质上都是需要用户调用read/recv去从内核缓冲区把数据读完再处理业务逻辑。

异步io则是内核已经把数据读好了,用户直接处理逻辑。

异步IO在linux下一般是用aio库。

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

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

open系统使用技巧?

open系统是多种语言、环境的一种函数。

LINUX中open函数作用:打开和创建文件。PB程序语言中open功能:打开窗口。

对于open系统来说,第三个参数仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位。

pathname 是待打开/创建文件的POSIX路径名;flags 用于指定文件的打开/创建模式,这个参数可由以下常量通过逻辑位或逻辑构成。

打开/创建文件时,至少得使用上述三个常量中的一个。

以下常量是选用的:

1.设置为非阻塞模式

2.以下三个常量同样是选用的,它们用于同步输入输出

3.open返回的文件描述符一定是最小的未被使用的描述符。