c - 一个信号在阻塞模式下中断发送方法

标签 c sockets

我正在使用阻塞模式的套接字编程,我有一个关于 send 的问题方法。

send 的手册页中方法,它说:

[EINTR] A signal interrupts the system call before any data is transmitted.



这意味着如果一个信号在任何数据传输之前中断系统调用,send将返回 -1 和 errno将设置为 EINTR .

我的问题是,如果信号中断系统调用时已经传输了一部分数据,会返回什么。似乎它不应该返回 -1,因为它已经发送了一些数据。我认为它会返回已传输的数据数量,这意味着 send阻塞模式中的方法返回的数据数量可能少于您作为第三个参数传递的数据数量。
ssize_t send(int socket, const void *buffer, size_t length, int flags);

最佳答案

documentation清楚了。

RETURN VALUE

On success, these calls return the number of bytes sent. On error, -1 is returned, and errno is set appropriately.

[...]

EINTR A signal occurred before any data was transmitted;


send()要么返回
  • 发送的字节数
  • -1

  • -1返回原因通过 errno 的值指示.

    errno等于 EINTR信号中断 send()未收到任何数据 迄今为止。

    从上面的信息可以安全地得出结论,如果数据已收到send()函数不会返回 -1 ,无论是否收到信号。

    关于c - 一个信号在阻塞模式下中断发送方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31157370/

    相关文章:

    c - 将 fprintf() 插入此循环会导致其无限循环。为什么?

    python - 如何从 Django Channels 网络套接字数据包中获取当前用户?

    python - 无法在通过python建立的tcp套接字上使用原始数据包处理mysql登录?可能是因为盐的原因?

    ruby - 如何防止 "The connection was reset"错误?

    c - 在 C 中定义类似函数的宏时,使用 {} 对或 () 对有什么区别吗?

    使用 C 程序理解 CPU 缓存

    c - MEX (C -> Matlab) 在 mac/linux 和 windows 上转换为 int -> double 不同

    c# - 我应该使用 while(true) 从 Socket 接收数据吗?

    java - Android TCP - 应用程序关闭时套接字不会断开连接

    c - 简单 C 代码中的意外输出