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

网站建设报价方案对比互联网开发技术

网站建设报价方案对比,互联网开发技术,自己做游戏网站学什么,什么属于网页制作工具目录 一、fcntl 函数本质 二、函数原型与参数深度解析 参数详解 fd cmd 可变参数 arg 三、关键命令详解与实战代码 1. 文件状态标志操作 2. 文件锁操作(重点) 3. 文件描述符标志操作 四、高级应用场景与陷阱 1. 非阻塞 I/O 的实现 2. 多进程…

目录

一、fcntl 函数本质

二、函数原型与参数深度解析

参数详解

fd

cmd

可变参数 arg

三、关键命令详解与实战代码

1. 文件状态标志操作

2. 文件锁操作(重点)

3. 文件描述符标志操作

四、高级应用场景与陷阱

1. 非阻塞 I/O 的实现

2. 多进程文件追加写入

3. 文件锁的注意事项

五、常见错误与调试技巧

六、与其他函数的对比

七、总结与最佳实践

#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */);
命令类型示例命令功能描述
文件状态标志操作F_GETFLF_SETFL获取/设置文件状态标志
文件描述符标志操作F_GETFDF_SETFD获取/设置 close-on-exec 标志
文件锁操作F_SETLKF_SETLKW设置非阻塞/阻塞锁
描述符复制F_DUPFDF_DUPFD_CLOEXEC复制文件描述符

一、fcntl 函数本质

fcntl(File Control)是 Unix/Linux 系统调用中对文件描述符进行精细控制的核心工具。它直接操作内核中的文件表项(File Table Entry),实现以下功能:

  • 修改文件状态标志(如读写模式、阻塞/非阻塞模式)。

  • 管理文件锁(Advisory Locking,协调多进程访问)。

  • 控制文件描述符属性(如 close-on-exec 标志)。

  • 获取/复制文件描述符(如 F_DUPFD)。


二、函数原型与参数深度解析

#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */);

参数详解

  1. fd

    • 作用:已打开的文件描述符(如通过 open()socket() 获得)。

    • 内核关联:指向内核文件表项(包含文件状态标志、文件偏移量等)。

  2. cmd

    • 核心命令分类

      命令类型示例命令功能描述
      文件状态标志操作F_GETFLF_SETFL获取/设置文件状态标志
      文件描述符标志操作F_GETFDF_SETFD获取/设置 close-on-exec 标志
      文件锁操作F_SETLKF_SETLKW设置非阻塞/阻塞锁
      描述符复制F_DUPFDF_DUPFD_CLOEXEC复制文件描述符
  3. 可变参数 arg

    • 类型与意义:依赖 cmd 的值,可能是整数、结构体指针等。

    • 典型用法

      • F_SETFL:传递整型标志(如 O_NONBLOCK)。(设置非阻塞)

      • F_SETLK:传递 struct flock* 指针定义锁行为。

把fp对应的文件设置为非阻塞

fp = popen("mplayer  00.mp4 ...", "r");
// 设置非阻塞模式
// 1. 获取当前描述符的状态标记
int flag = fcntl( fp->_fileno , F_GETFL );// 2. 给当前的状态增加非阻塞选项
flag |= O_NONBLOCK ;// 3. 把添加了非阻塞模式的属性设置回描述符即可
fcntl( fp->_fileno , F_SETFL , flag );

三、关键命令详解与实战代码

1. 文件状态标志操作

  • F_GETFL
    作用获取文件状态标志(包括访问模式和其他标志)。
    返回值:由标志位组成的整型值,需通过掩码解析。

    int flags = fcntl(fd, F_GETFL);
    if (flags == -1) {perror("fcntl F_GETFL failed");exit(EXIT_FAILURE);
    }// 解析访问模式
    int access_mode = flags & O_ACCMODE;  // O_ACCMODE = 3(二进制掩码)
    if (access_mode == O_RDONLY)  printf("Read-Only\n");
    else if (access_mode == O_WRONLY) printf("Write-Only\n");
    else if (access_mode == O_RDWR)   printf("Read-Write\n");// 检查其他标志
    if (flags & O_APPEND)    printf("Append mode enabled\n");
    if (flags & O_NONBLOCK)  printf("Non-blocking mode\n");
  • F_SETFL
    作用设置文件状态标志。仅能修改部分标志(如 O_APPENDO_ASYNCO_NONBLOCK)。
    注意:无法修改访问模式(如 O_RDWR),需在 open() 时确定。

// 启用非阻塞模式 + 追加写入
int new_flags = flags | O_NONBLOCK | O_APPEND;
if (fcntl(fd, F_SETFL, new_flags) == -1) {perror("fcntl F_SETFL failed");
}

2. 文件锁操作(重点)

文件锁用于协调多进程对同一文件的读写。fcntl 支持 劝告锁(Advisory Locks),需进程主动检查锁状态。

  • 锁结构体 struct flock

    struct flock {short l_type;   // 锁类型:F_RDLCK(读锁), F_WRLCK(写锁), F_UNLCK(解锁)short l_whence; // 锁起点:SEEK_SET, SEEK_CUR, SEEK_ENDoff_t l_start;  // 锁起始偏移(相对于 l_whence)off_t l_len;    // 锁长度(0 表示到文件末尾)pid_t l_pid;    // 持有锁的进程ID(由 F_GETLK 填充)
    };
  • 命令详解

    • F_GETLK:检测锁冲突,不实际加锁。

      struct flock lock;
      memset(&lock, 0, sizeof(lock));
      lock.l_type = F_WRLCK;  // 检查是否可加写锁
      lock.l_whence = SEEK_SET;
      lock.l_start = 0;
      lock.l_len = 0;         // 整个文件if (fcntl(fd, F_GETLK, &lock) == -1) {perror("fcntl F_GETLK failed");
      }
      if (lock.l_type == F_UNLCK) {printf("锁可加\n");
      } else {printf("锁被进程 %d 持有\n", lock.l_pid);
      }
    • F_SETLK:非阻塞加锁/解锁。若锁冲突,立即返回 -1

      lock.l_type = F_WRLCK;
      if (fcntl(fd, F_SETLK, &lock) == -1) {if (errno == EACCES || errno == EAGAIN) {printf("无法加锁:已被其他进程占用\n");} else {perror("fcntl F_SETLK failed");}
      }
    • F_SETLKW:阻塞加锁(Wait),直到锁可用或信号中断。

      if (fcntl(fd, F_SETLKW, &lock) == -1) {if (errno == EINTR) { // 被信号中断printf("加锁被中断\n");} else {perror("fcntl F_SETLKW failed");}
      }

3. 文件描述符标志操作

  • F_GETFD/F_SETFD
    管理 close-on-exec 标志(FD_CLOEXEC)。

    // 设置 close-on-exec
    int fd_flags = fcntl(fd, F_GETFD);
    fd_flags |= FD_CLOEXEC;
    fcntl(fd, F_SETFD, fd_flags);// 验证:执行 exec 后,fd 会被自动关闭

四、高级应用场景与陷阱

1. 非阻塞 I/O 的实现

通过 O_NONBLOCK 标志,使 read()/write() 不阻塞:

int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);char buf[1024];
ssize_t n = read(fd, buf, sizeof(buf));
if (n == -1) {if (errno == EAGAIN || errno == EWOULDBLOCK) {printf("无数据可读,继续其他操作\n");} else {perror("read error");}
}
2. 多进程文件追加写入

通过 O_APPEND 确保原子追加:

// 进程A和进程B同时运行以下代码
int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | O_APPEND);// 写入操作自动定位到文件末尾,避免覆盖
write(fd, "Data from Process\n", strlen(...));
3. 文件锁的注意事项
  • 锁继承:子进程不继承父进程的文件锁。

  • 锁释放:文件描述符关闭时,自动释放所有关联锁。

  • 锁粒度:可锁定文件任意字节范围,甚至重叠区域。


五、常见错误与调试技巧

  1. fcntl 返回 -1

    • EBADF:无效文件描述符(检查 fd 是否已关闭)。

    • EACCES/EAGAIN:文件锁冲突(需处理重试或阻塞)。

    • EINVAL:无效命令或参数(检查 cmd 和 arg 类型)。

  2. 锁竞争调试

    • 使用 F_GETLK 检测锁状态。

    • 结合 strace 跟踪进程的系统调用。


六、与其他函数的对比

函数用途控制粒度跨进程支持
fcntl通用文件描述符控制(标志、锁等)文件级别/字节级
ioctl设备专用控制(如终端、网络接口)设备相关依赖设备
flock简化版文件锁(整个文件)文件级别

七、总结与最佳实践

  • 优先使用标准函数:如 fileno(fp) 替代直接访问 _fileno

  • 错误处理:始终检查 fcntl 返回值,处理 errno

  • 锁的协调:明确锁的范围和类型(读/写锁),避免死锁。

  • 性能考量:频繁加锁/解锁可能影响性能,需权衡设计。


文章转载自:

http://EapR0vD4.jhgxh.cn
http://0c1of7zf.jhgxh.cn
http://Cesfwtue.jhgxh.cn
http://ctL9WRFH.jhgxh.cn
http://jSOYwpeH.jhgxh.cn
http://81OGPTKu.jhgxh.cn
http://B5DniLTw.jhgxh.cn
http://iSU7H73P.jhgxh.cn
http://piZ7I7Cw.jhgxh.cn
http://XeFiHtPD.jhgxh.cn
http://wATyPQQk.jhgxh.cn
http://GQwQvtJ6.jhgxh.cn
http://adZB1jdH.jhgxh.cn
http://kj75WumD.jhgxh.cn
http://6APlRLFg.jhgxh.cn
http://Xjt2ApBp.jhgxh.cn
http://WAmTVWDZ.jhgxh.cn
http://uxfuLPRQ.jhgxh.cn
http://1t3Z7TWB.jhgxh.cn
http://t3tRECHH.jhgxh.cn
http://95z9dMTb.jhgxh.cn
http://lQLG2LIz.jhgxh.cn
http://4gjld8Ah.jhgxh.cn
http://moKU5TAy.jhgxh.cn
http://Dz7UJHLn.jhgxh.cn
http://ep8UaGcl.jhgxh.cn
http://zBg8S61f.jhgxh.cn
http://7BN0tHZ6.jhgxh.cn
http://nnuTBEDi.jhgxh.cn
http://RkfjFLIs.jhgxh.cn
http://www.dtcms.com/wzjs/777939.html

相关文章:

  • wordpress进网站慢北京城乡建设和住房门户网站
  • 江门阿里巴巴网站建设甜品网站建设项目规划书
  • 美容培训东莞网站建设眉山市规划建设局网站
  • 网站建设与网页制作教程me域名免费注册
  • 网站导航栏种类学校官网主页网页设计
  • 哪个网站可以做问卷榆次建设局网站
  • 做网站软件_手机电脑网页版qq登录入口
  • 北京网站排名公司dw属于什么的网页制作工具
  • 安徽省高路建设有限公司网站网站标题关键词用什么隔开
  • 哪里有做网站设计小程序制作
  • asp简单购物网站源码个人网站如何建
  • 温州企业网站建设要多少钱社保网站做员工用工备案吗
  • 如何申请网站域名流程做英文网站需要多长时间
  • 全国网站建设公司排名正定网站制作
  • php+mysql 网站建设安徽省建设协会网站
  • 做外贸在哪个网站比较好大气红色礼品公司网站源码
  • 网站型销售怎么做wordpress 管理页面
  • 如何做网站主页室内设计效果图360全景图
  • 有没有什么免费的网站百度推广入口页面
  • 青岛网站建设好不好做零售出口的网站
  • 网站备案号在哪里看外包网站
  • 甘肃省住房和城乡建设厅官方网站久久建筑网西瓜视频
  • 怎么样自己建立网站网店推广平台
  • 买外链网站长江设计公司
  • 利为汇网站建设遨游网站建设有限公司
  • psd数据网站项目负责人质量建设厅官方网站
  • WordPress一键环境兰州网站搜索优化
  • wordpress开源程序建站教程办个网站需要多少钱
  • 福州网站建设求职简历网站建设在哪里找
  • 湖南建设工程信息网站iis 网站显示建设中