• Unix高级环境编程之fcntl函数


    #include <fcntl.h>
    int fcntl(int fd, int cmd, ...)
    

    fcntl功能

    1. 复制一个现有的描述符 (cmd = F_DUPFD)
    返回值:新文件描述符, 新描述符__和fd共享__同一文件表项
    dup(fd) <===> fcntl(fd, F_DUPFD, 0)
    
    dup2(fd1, fd2) 
    <===>
    close(fd2);
    fcntl(fd1, F_DUPFD, fd2)
    
    1. 获得/设置文件描述符标记(cmd = F_GETFD 或者 F_SETFD)
      F_GETFD 对应于fd的文件描述符标志作为函数返回值
      F_SETFD 给fd设置文件描述符,新标志值按第三个参数设置

    2. 获得/设置文件状态标志(cmd = F_GETFL 或者 F_SETFL)
      Note: F_GETFL:文件状态标志作为返回值
      O_RDONLY ------> 只读
      O_WRONLY ------> 只写
      O_RDWR ------> 为读写打开
      O_APPEND ------> 每次写时追加
      O_NONBLOK------> 非阻塞模式
      O_SYNC ------> 等待写完成(数据和属性)
      O_DSYNC ------> 等待写完成(仅数据)
      O_RSYNC ------> 读写同步
      NOTE: ** O_RDONLY,O_WRONLY,O_RDWR三种标志并不各占一位,由于历史原因这三种值互斥,一个文件只能有这三个值之一.因此必须用屏蔽字O_ACCOMDE**取得访问模式位,然后将结果与这三个值中任意一个比较.

    3. 获得/设置异步IO所有权(cmd = F_GETDOWN 或者 F_SETDOWN)

    4. 获得/设置记录锁(cmd = F_GETLK, F_SETLK 或者 F_SETLKW)

    #include <iostream>
    #include <fcntl.h>
    #include <stdlib.h>
    using namespace std;
    
    int main(int argc, char** argv)
    {
    	if (argc != 2) {
    		cout << "Usage error" << endl;
    		return -1;
    	}
    
    	cout << "argv[0]:" << argv[0] << " argv[1]:" << argv[1] << endl;
    
    	int val = 0;
    
    	//O_RDONLY 00
    	//O_WRONLY 01
    	//O_RDWR   02
    	//三种标志并不各站
    	if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) {
    		cout << "fcntl getfl error" << endl;
    		return -1;
    	}
    
    	switch (val & O_ACCMODE) { //取得访问标志位.
    	case O_RDONLY:
    		cout << "read only" << endl;
    		break;
    	case O_WRONLY:
    		cout << "write only" << endl;
    		break;
    	case O_RDWR:
    		cout << "read write" << endl;
    		break;
    	default:
    		cout << "unkown access mode" << endl;
    	}
    
    	if (val & O_APPEND) {
    		cout << ", append" << endl;
    	}
    
    	if (val & O_NONBLOCK) {
    		cout << ", nonblock" << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    ORA-01033: ORACLE initialization or shutdown in progress
    String.Format 格式化货币的小问题
    SQL Server——存储过程
    如何书写优雅、漂亮的SQL脚本?
    清除Chrome浏览器的历史记录、缓存
    SQL模板资源管理器,你用了吗?
    WPF笔记(2.4 Grid)
    python实现插入排序
    冒泡算法实现
    python获取本地ip地址的方法
  • 原文地址:https://www.cnblogs.com/457220157-FTD/p/5331023.html
Copyright © 2020-2023  润新知