当前位置: 首页 > wzjs >正文

上海建设局网站 招聘在线logo生成免费

上海建设局网站 招聘,在线logo生成免费,推广app有哪些,ASP动态商业网站建设案例在 Linux 系统编程中,fcntl() 函数(File Control)是用于操作文件描述符的核心函数,可控制文件或套接字的底层属性。它支持多种操作,包括设置非阻塞模式、获取/设置文件状态标志、管理文件锁等。以下是详细概念和使用案…

在 Linux 系统编程中,fcntl() 函数(File Control)是用于操作文件描述符的核心函数,可控制文件或套接字的底层属性。它支持多种操作,包括设置非阻塞模式、获取/设置文件状态标志、管理文件锁等。以下是详细概念和使用案例:


核心概念

1. 函数原型
#include <unistd.h>
#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );
  • 参数
    • fd:要操作的文件描述符(文件、管道、套接字等)。
    • cmd:控制命令(如 F_GETFLF_SETFLF_SETLK 等)。
    • arg:可选参数,具体类型取决于 cmd
  • 返回值
    • 成功:根据 cmd 不同返回不同值(如 F_GETFL 返回当前标志位)。
    • 失败:返回 -1,错误码通过 errno 获取。
2. 常用命令(cmd 参数)
命令作用
F_GETFL获取文件状态标志(如 O_RDONLYO_NONBLOCK)。
F_SETFL设置文件状态标志(只能修改部分标志,如 O_NONBLOCKO_APPEND)。
F_GETFD获取文件描述符标志(如 FD_CLOEXEC)。
F_SETFD设置文件描述符标志。
F_SETLK设置文件锁(非阻塞)。
F_SETLKW设置文件锁(阻塞)。
F_GETLK检查锁是否可设置。

使用案例

1. 设置文件描述符为非阻塞模式

常用于套接字或管道,避免 readaccept 等调用阻塞程序。

#include <fcntl.h>
#include <unistd.h>int set_nonblocking(int fd) {int flags = fcntl(fd, F_GETFL, 0);  // 获取当前标志if (flags == -1) {return -1;  // 错误处理}flags |= O_NONBLOCK;                // 添加非阻塞标志if (fcntl(fd, F_SETFL, flags) == -1) {return -1;  // 错误处理}return 0;
}// 示例:设置套接字为非阻塞
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
set_nonblocking(sockfd);
2. 设置文件追加模式

确保每次写入文件时数据追加到末尾。

int fd = open("log.txt", O_WRONLY | O_CREAT, 0644);
int flags = fcntl(fd, F_GETFL, 0);
flags |= O_APPEND;
fcntl(fd, F_SETFL, flags);
3. 文件锁(防止多进程/多线程竞争)

通过锁机制协调多个进程对同一文件的访问。

#include <fcntl.h>
#include <stdio.h>int lock_file(int fd) {struct flock fl;fl.l_type = F_WRLCK;    // 排他锁(写锁)fl.l_whence = SEEK_SET; // 从文件头开始fl.l_start = 0;         // 锁定区域起始偏移fl.l_len = 0;           // 锁定到文件末尾fl.l_pid = getpid();    // 当前进程ID// 非阻塞方式尝试加锁if (fcntl(fd, F_SETLK, &fl) == -1) {perror("fcntl: lock failed");return -1;}return 0;
}int unlock_file(int fd) {struct flock fl;fl.l_type = F_UNLCK;     // 解锁fl.l_whence = SEEK_SET;fl.l_start = 0;fl.l_len = 0;fl.l_pid = getpid();if (fcntl(fd, F_SETLK, &fl) == -1) {perror("fcntl: unlock failed");return -1;}return 0;
}// 使用示例
int main() {int fd = open("data.txt", O_RDWR | O_CREAT, 0644);if (fd == -1) {perror("open failed");return 1;}if (lock_file(fd) == 0) {printf("Lock acquired!\n");// 写入数据...unlock_file(fd);}close(fd);return 0;
}

关键注意事项

  1. 非阻塞模式

    • 对套接字设置 O_NONBLOCK 后,acceptreadwrite 等操作会立即返回,需检查 errno 是否为 EAGAINEWOULDBLOCK
    • 示例检查非阻塞读:
      char buf[1024];
      ssize_t n = read(fd, buf, sizeof(buf));
      if (n == -1) {if (errno == EAGAIN || errno == EWOULDBLOCK) {// 无数据可读,稍后重试} else {perror("read error");}
      }
      
  2. 文件锁

    • 锁类型
      • F_RDLCK:共享读锁(允许多个进程同时读)。
      • F_WRLCK:排他写锁(独占文件)。
      • F_UNLCK:释放锁。
    • 锁继承:文件锁不会被子进程继承。
    • 锁范围l_startl_len 定义锁定区域,l_len = 0 表示到文件末尾。
  3. 原子性操作

    • fcntl 的锁操作是原子性的,适合多进程同步。
  4. 错误处理

    • 检查 fcntl 返回值,结合 errno 处理错误(如 EACCESEBADF)。

扩展案例:检查文件锁状态

void check_lock(int fd) {struct flock fl;fl.l_type = F_WRLCK;    // 检查写锁fl.l_whence = SEEK_SET;fl.l_start = 0;fl.l_len = 0;fl.l_pid = getpid();if (fcntl(fd, F_GETLK, &fl) == -1) {perror("fcntl: F_GETLK failed");return;}if (fl.l_type == F_UNLCK) {printf("No lock on the file.\n");} else {printf("File is locked by process %d\n", fl.l_pid);}
}

总结

  • fcntl 的核心用途
    • 修改文件描述符属性(如非阻塞模式)。
    • 管理文件锁(协调多进程/线程访问)。
    • 获取或设置文件状态标志。
  • 典型场景
    • 网络编程中设置非阻塞套接字。
    • 多进程日志文件的并发写入控制。
    • 确保文件操作的原子性。

文章转载自:

http://PaUPlskw.dgmjm.cn
http://sIlktcKU.dgmjm.cn
http://AT602k6I.dgmjm.cn
http://JRl2zujw.dgmjm.cn
http://avc1HdsI.dgmjm.cn
http://dJFtZMBQ.dgmjm.cn
http://DEYXsVqp.dgmjm.cn
http://zHbkQCqN.dgmjm.cn
http://EQ1O6xvI.dgmjm.cn
http://qpD2jxtA.dgmjm.cn
http://VeSOxO7B.dgmjm.cn
http://YBQNwQlR.dgmjm.cn
http://nbkCWiSc.dgmjm.cn
http://fkIMci6E.dgmjm.cn
http://ZXMaKnr0.dgmjm.cn
http://sOQiGrRF.dgmjm.cn
http://IZ0Spsc1.dgmjm.cn
http://ZDNJ6VBr.dgmjm.cn
http://tBlUfT8A.dgmjm.cn
http://Ln6yI5ix.dgmjm.cn
http://SG4Ak9AG.dgmjm.cn
http://Ekd1ZLOx.dgmjm.cn
http://CJgIsCtL.dgmjm.cn
http://qudNVfGG.dgmjm.cn
http://BbfgqTtC.dgmjm.cn
http://pwrV79lg.dgmjm.cn
http://0F4FgmdW.dgmjm.cn
http://1HGQ6oqB.dgmjm.cn
http://JPtWZK4D.dgmjm.cn
http://vtuX12CL.dgmjm.cn
http://www.dtcms.com/wzjs/661298.html

相关文章:

  • 成都网站建设找重庆最佳科技wordpress调整配置出错了
  • 竞价网站如何设计iis7搭建网站
  • 专业企业网站搭建服务光明新区住房和建设局网站
  • 手机网站一年费用吗wordpress查看图片插件
  • 西安在线网站富阳招聘网
  • 建设银行网站买手机100个新公司起名
  • 慈溪网站建设为什么网站搜索不到
  • 个人网站 可以自己做服务器灌南县规划局网站理想家园规划建设
  • 温州建网站合作社网站建设
  • 成都网站建设哪些公司好毕业设计可以做网站吗
  • 网站视频弹窗代码wordpress前台登录框
  • 分析网站的优势和不足男女做暖暖视频网站
  • 亦庄网站建设价格五种营销工具
  • 青岛做个网站多少钱南京户外广告公司排行榜
  • 模板网站建设价格百度小程序登录入口
  • 企业网站的建站步骤网页设计师联盟网站怎么
  • 网站建设报价单初期整理如何自己制作游戏软件
  • 山东网站备案注意事项wordpress4.9.x火车头发布
  • 湖北省建设工程人力资源网站中国上海门户网
  • 网站开发设计流程文档哈尔滨网页设计与制作
  • 石家庄微网站wordpress主题重新激活
  • qq空间网站域名怎么做的网站seo优化技能
  • 开发和发布网站的主要流程做英语阅读的网站
  • 免费网站空间虚拟主机科技公司网站响应式
  • 高密网站建设网站运作模式
  • 珠海建站国外建站用什么最多
  • 五金表带厂东莞网站建设wordpress备份数库
  • 自己电脑做网站要下载佛山营销手机网站建设
  • 网站空间怎么更换邯郸学校网站建设价格
  • 生产企业网站欣赏seo人才招聘