gpt4 book ai didi

c - unix套接字中的异步和非阻塞有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 16:29:48 25 4
gpt4 key购买 nike

我在 nginx 中看到这样的代码:

if(fcntl(ngx_processes[s].channel[0], F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) == -1) {
...
if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {
...

任何人都可以告诉我 fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)ioctl(s, FIOASYNC, &on) 有什么区别, asyncnonblocking 不是一回事吗??

最佳答案

FIOASYNC 切换 O_ASYNC 标志(通常在 open(2)fcntl(2)) 对于文件描述符,当文件描述符准备好 IO 时,它将要求内核向进程发送 SIGIOSIGPOLL

O_ASYNC 不常使用:

  • 在信号处理程序中正确处理 IO 是极其困难的;最好让它们尽可能小
  • 因为信号会中断程序的控制流,所以与标准系统调用(例如 select(2)poll(2))相比,它们的运行“成本更高”
  • 信号提供的信息比其他调用少:它们只报告一个 fd 就绪,而许多 fd 可能就绪。

O_NONBLOCK 不向用户进程提供 任何 通知 fd 已准备好 read(2) write(2) —— 相反,它改变了 read(2)write(2) 的行为以及类似的调用,如果文件描述符尚未准备好阅读或写作。 O_NONBLOCK 通常与 select(2)poll(2)similar calls 结合使用以保证客户端或服务器的主循环不会阻塞在一个特定的对等点上,从而使所有对等点都饿死。

关于c - unix套接字中的异步和非阻塞有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6260114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com