linux(四)

本文介绍了文件操作的基础,包括IO、文件映射、文件描述符等概念,并深入讲解了lseek、mmap等关键函数的使用。同时,还探讨了Curses库的基本原理和编程模型,展示了如何通过Curses实现字符界面的绘制与交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.IO与文件映射
    1.IO的共享与效率
        read与write其中数据缓冲的大小
        读取数据的缓冲:getpagesize。    
    2.定位与定位读取(随机读取)
        read与write在操作的时候,自动移动读取位置.
        lseek改变读取位置.

        pread/pwrite在指定位置读写。
        2.1.lseek的函数说明:     
                off_t   lseek(
                    int fd,//定位文件描述符号
                    off_t off,//定位位置
                    int whence//定位参照点:文件开始位置/文件结束位置/文件当前位置
                                        //SEEK_SET    SEEK_END  SEEK_CUR
                    );

                返回:
                            返回当前读取位置在文件中的绝对位置.
        2.2.lseek的作用:定位文件的位置
                问题:lseek的定位的位置超出文件的大小范围?
                lseek移动位置只要合法,都是有效
        2.3.lseek+write=pwrite
            lseek+read =pread
        2.4.案例:
                    读取一个特殊的文件:
                            /proc/${pid}/mem文件程序的虚拟内存文件
        3.文件的其他操作
                fstat获取文件状态
                ftruncate改变文件大小
        4.文件映射:
                虚拟地址映射到内存。
                虚拟地址可以映射到文件:可以用内存方式访问文件.
                mmap/munmap
        案例:
                1.使用内存方式写入数据                

2.使用内存方式读取数据

二.文件描述符号的操作(IO锁)
        文件描述符号是整数.文件描述符号对应内核的上下文环境. 
        1.dup  dup2拷贝文件描述符号
            dup拷贝文件符号,返回系统指定的整数
            dup2拷贝文件描述符号,返回用户指定的整数
        2.fcntl对文件描述的属性的修改
                2.1.拷贝文件描述符号
                2.2.修改判定文件的描述标记
                2.3.修改判定文件的状态标记
                                    O_RDONLY O_WRONLY _ORDWR  O_CREAT O_EXCL

                                    O_APPEND O_ASYN
                2.4.设置强制锁(重新编译内核)
                2.5.设置建议锁(默认)
                2.6.设置的信号   

三.IO与Curses(介绍)
        Curses:CUI

        UI:User Interface.
            CUI:字符界面
            GUI:图形界面

    使用一套封装库  libcurses.so
    /usr/lib目录下

    编译只需要指定-lcurses
    老版本:libcurses.so
    新的版本:libncurses.so
    如果头文件curses.h不存在,请尝试使用ncurses.h
    如果库curses不存在,尝试使用ncurses

    printf /scanf标准IO
    大部分标准IO重定向到终端./dev/tty  /dev/pts/1

    curses就是终端输出.
    -lcurses   -ncurses 

    为了防止printf重定向到终端破坏UI,禁止在curses中使用标准IO.


    1.编程模型
            初始化终端initscr
            操作终端(输入/输出/定位/刷新....)
            释放终端endwin
    2.显示
            2.1.图形输出
                border              
                box             
                hline               
                vline

                属性字符:字节=属性字节+字符字节
            注意:
                    box需要窗体.
                    initscr返回被初始化的窗体:标准屏幕WINDOW*
                    实际上curses定义一个全局变量stdscr就是标准屏幕   
            函数命名规则:
                        ****            标准屏幕stdscr
                        w****       指定窗体
                        mv****      指定位置
                        mvw****     指定窗体的指定位置
            2.2.刷屏
                    void refresh()          
                    void wrefresh(WINDOW*);

                    从里到外刷屏
            2.3.字符输出
                    addch
                    普通字符:''
                    属性字符:   ''|属性                   
                    特殊的属性字符:比如ACS_PI
            2.4.字符串输出
                    int addstr(const char *);
            2.5.格式字符串输出
                    int printw(const char*,....);       


    3.字符属性与颜色
                颜色属性
                3.1.判定终端是否支持颜色
                        bool has_colors();//都支持颜色,建议不判定
                3.2.初始化颜色:
                        int start_color();
                3.3.定义颜色对
                        int init_pair(short pair,short fore,short back);
                3.4.使用颜色对
                        COLOR_PAIR(short pair)                      
                3.5.设置属性
                        attron()开启属性
                        attroff()关闭属性
                这组函数一定要在initscr后调用

                背景函数:
                        bkgd(); 
案例:
            1.时间显示屏幕
                    1.初始化
                    2.循环显示时间,并且睡眠1秒
                    3.释放
            2.登录界面
                    1.初始化
                    2.绘制界面
                                头
                                绘制用户名输入区
                                绘制密码输入区

                    3.等待输入
                    4.结束

    4.输入
            1.字符输入
                int getch();
                返回的是字符
                禁止回显noecho
                使功能键有效,使用keypad(WINDOW*,bool)
案例:
            使用键盘控制字母在屏幕上的移动

            补充:
                    curses屏幕清除:man 3 clear
                            clear
                            erase   
                    光标控制:
                            得到光标位置      getsyx
                            设置光标的位置 setsyx
                            控制光标是否可见:curs_set();

            2.字符串输入
                        int addstr

            3.格式数据输入
                    scanw

    5.窗口    
            subwin()//创建子窗体(坐标采用标准屏幕坐标)
            derwin()//创建子窗体(坐标采用父窗体坐标)







1.在vi设置编码:
        :set encoding=编码    gb2312  ios-8859-1  utf-8 
2.在编译器指定源文件的编码 -finput-charset=gb2312
3.在终端指定编码:
4.系统默认编码
        /etc/sysconfig/i18n配置编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值