SOCKATMARK - Linux手册页
时间:2019-08-20 18:01:21 来源:igfitidea点击:
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
sockatmark-确定套接字是否在带外标记
语法
#包括
int sockatmark(int sockfd);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
sockatmark():_POSIX_C_SOURCE> = 200112L
说明
sockatmark()返回一个值,该值指示文件描述符sockfd所引用的套接字是否处于带外标记。如果套接字在标记处,则返回1;否则,返回1。如果套接字不在标记处,则返回0。此功能不会删除带外标记。
返回值
如果套接字在带外标记处,则对sockatmark()的成功调用将返回1,否则返回0。发生错误时,将返回-1并将errno设置为指示错误。
错误说明
- EBADF
- sockfd不是有效的文件描述符。
- EINVAL
- sockfd不是可以将sockatmark()应用于的文件描述符。
版本
sockatmark()已在版本2.2.4中添加到glibc。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
sockatmark() | Thread safety | MT-Safe |
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
如果sockatmark()返回1,则可以使用recv(2)的MSG_OOB标志读取带外数据。
仅某些流套接字协议支持带外数据。
可以从SIGURG信号的处理程序中安全地调用sockatmark()。
sockatmark()是使用SIOCATMARK ioctl(2)操作实现的。
BUGS
在glibc 2.4之前,sockatmark()不起作用。
示例
收到SIGURG信号后,可以使用以下代码读取(并丢弃)标记之前的所有数据,然后读取标记处的数据字节:
char buf[BUF_LEN]; char oobdata; int atmark, s; for (;;) { atmark = sockatmark(sockfd); if (atmark == -1) { perror("sockatmark"); break; } if (atmark) break; s = read(sockfd, buf, BUF_LEN); if (s == -1) perror("read"); if (s <= 0) break; } if (atmark == 1) { if (recv(sockfd, &oobdata, 1, MSG_OOB) == -1) { perror("recv"); ... } }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。