使用fcntl设置文件描述符属性、 设置tcp通信用套接字为非阻塞模式(unblock)和设置tcp通信用套接字信号异步驱动模式

C语言 同时被 3 个专栏收录
53 篇文章 0 订阅
12 篇文章 0 订阅
30 篇文章 0 订阅
  • 定义函数
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg); /*arg 参数可有可无 */ 
int fcntl(int fd, int cmd, struct flock * lock);/*arg 参数可有可无 */ 
  • 函数说明
    fcntl()用来操作文件描述词的一些特性. 参数 fd 代表欲设置的文件描述词, 参数 cmd 代表欲操作的指令.有以下几种情况:
cmd内容
F_DUPFD用来查找大于或等于参数 arg 的最小且仍未使用的文件描述词, 并且复制参数 fd 的文件描述词. 执行成功则返回新复制的文件描述词. 请参考 dup2().
F_GETFD取得 close-on-exec 旗标. 若此旗标的 FD_CLOEXEC 位为 0, 代表在调用 exec()相关函数时文件将不会关闭.
F_SETFD设置 close-on-exec 旗标. 该旗标以参数 arg 的 FD_CLOEXEC 位决定.
F_GETFL取得文件描述词状态旗标, 此旗标为 open()的参数 flags.
F_SETFL设置文件描述词状态旗标, 参数 arg 为新旗标, 但只允许 O_APPEND、O_NONBLOCK 和O_ASYNC 位的改变, 其他位的改变将不受影响.
F_GETLK取得文件锁定的状态.
F_SETLK设置文件锁定的状态. 此时 flcok 结构的 l_type 值必须是 F_RDLCK、F_WRLCK 或F_UNLCK. 如果无法建立锁定, 则返回-1, 错误代码为 EACCES 或 EAGAIN.
F_SETLKW同 F_SETLK 作用相同, 但是无法建立锁定时, 此调用会一直等到锁定动作成功为止. 若在等待锁定的过程中被信号中断时, 会立即返回-1, 错误代码为 EINTR.
F_SETOWN设置信号响应 仅限SIGIO、SIGURG ,且arg必须是getpid()
  • 参数 lock 指针为 flock 结构指针, 定义如下
struct flcok
{
short int l_type; //锁定的状态
short int l_whence; //决定 l_start 位置
off_t l_start; //锁定区域的开头位置
off_t l_len; //锁定区域的大小
pid_t l_pid; //锁定动作的进程
};
l_type有三种状态:
F_RDLCK建立一个供读取用的锁定
F_WRLCK建立一个供写入用的锁定
F_UNLCK删除之前建立的锁定
l_whence也有三种方式:
SEEK_SET以文件开头为锁定的起始位置.
SEEK_CUR以目前文件读写位置为锁定的起始位置
SEEK_END以文件结尾为锁定的起始位置.
  • 返回值
    成功则返回 0, 若有错误则返回-1, 错误原因存于 errno.

设置tcp通信用套接字阻塞模式(block)为非阻塞模式(unblock)

  • 阻塞模式:
    没有接到数据时会一直停留
  • 非阻塞模式:
    不管有没有接收到数据都会一直走下去
long status = fcntl(tcp_fd, F_GETFL);/*获取文件描述符原有状态位 例如获得 	O_RDONLY,O_WRONLY*/
status |= O_NONBLOCK; //加入非阻塞模式,这里的位或是在原来的基础上再次添加
fcntl(tcp_fd, F_SETFL, status); //将新的状态放回文件描述符中

设置tcp通信用套接字信号异步驱动模式

由signal信号中SIGIO进行判断
在这里插入图片描述

signal(SIGIO, fuc);//注册signal函数fuc,用作SIGIO的响应
					//此时该函数不用循环接收!!
fcntl(tcp_fdF_SETOWN, getpid()); //设置当前进程号的进程为信号驱动
fcntl(tcp_fd, F_SETFL, O_ASYNC); //设置SIGIO为异步驱动

1.tcp数据可以接收完整的数据,若是udp则会接收最新发过来的数据,也就是说会覆盖掉旧的udp数据。

2.信号是软中断,它会直接打断sleep而触发!

  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值