问题描述
我使用 C 套接字发送设置了 MSG_DONTWAIT 标志的 ICMP 数据包。 我的程序是单线程的,但它希望以高频率发送消息,所以我将消息发送设置为非阻塞。 每次调用后共享/修改/重用消息缓冲区是否安全? (除非返回 EAGAIN 或 EWOULDBLOCK)。
msg_control(辅助数据)被重用,msg_control->struct in_pktinfo->ipi_ifindex(出站接口ifindex)在调用之间被修改。
iov.iov_base 缓冲区内容(不是指针!)和 iov.iov_len 也可以在调用之间改变。 (可能性较小,但仍有可能)。
是否可以在非阻塞模式下高频更改 calsl 之间的 ifinex 和 iov_base 内容? (除非我回来 EAGAIN 或 EWOULDBLOCK)
谢谢!
解决方法
是的,这是安全的。在 Linux 上,您指定的所有数据都会在 library(ggplot2)
ggplot(mtcars,aes(hp,mpg)) +
geom_point() +
scale_x_continuous(sec.axis = dup_axis(name = NULL,labels = NULL)) +
scale_y_continuous(sec.axis = dup_axis(name = NULL,labels = NULL))
返回之前立即复制到内核中的缓冲区中。如果内核的缓冲区已满,它会返回 EAGAIN 或 EWOULDBLOCK(这在 Linux 中显然是相同的)并且没有任何反应。您不必担心内核会在您更改缓冲区中的数据后稍后发送数据包。
在 Windows 上,非阻塞“重叠”操作做记住你的缓冲区并在以后使用它 - 所以如果你做过非阻塞 I/ O 在 Windows 上。 (你会知道如果你这样做,因为它与阻塞 I/O 完全不同)