1、通过设置套接字的属性,把其从阻塞模式改为非阻塞模式,即使没有数据到来或者连接建立,程序也不会一直等待,而是立刻返回。
2、超时机制:在代码中设置超时机制,即如果套接字在指定时间内依然处于阻塞状态,则退出程序。
3、信号处理:使用信号处理机制,在另一个线程中发送一个指定的信号,如SIGINT信号,当程序接收到该信号时,可以退出当前的阻塞状态。
阻塞 *** 作是指在执行设备 *** 作时,若不能获得资源,则挂起进程直到满足可 *** 作的条件后再进行 *** 作。被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞 *** 作的进程在不能进行设备 *** 作时,并不挂起,它要么放弃,要么不停地查询,直至可以进行 *** 作为止。驱动程序通常需要提供这样的能力:当应用程序进行read()、write()等系统调用时,若设备的资源不能获取,而用户又希望以阻塞的方式访问设备,驱动程序应在设备驱动的xxx_read()、xxx_write()等 *** 作中将进程阻塞直到资源可以获取,此后,应用程序的read()、write()等调用才返回,整个过程仍然进行了正确的设备访问,用户并没有感知到;若用户以非阻塞的方式访问设备文件,则当设备资源不可获取时,设备驱动的xxx_read()、xxx_write()等 *** 作应立即返回,read()、write()等系统调用也随即被返回,应用程序收到-EAGAIN返回值。
在阻塞访问时,不能获取资源的进程将进入休眠,它将CPU资源“礼让”给其他进程。因为阻塞的进程会进入休眠状态,所以必须确保有一个地方能够唤醒休眠的进程,否则,进程就真的“寿终正寝”了。唤醒进程的地方最大可能发生在中断里面,因为在硬件资源获得的同时往往伴随着一个中
断。而非阻塞的进程则不断尝试,直到可以进行I/O。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)