• 《Linux系统编程》----DAY2


    read函数:#include<fctnl.h>

    	ssize_t read(int fd,void* buf,size_t count);
    

    fd:文件描述符

    ​ buf:存数据的缓冲区

    ​ count:缓冲区大小

    ​ 返回值:

    ​ 0:表示读到文件末尾

    ​ 成功:读到的字节数

    ​ 失败:-1 设置errno

    ​ -1 并且 errno=EAGIN 或EWOULDBLOCK,说明不是read失败,而是read在以非阻塞读一个设备文件,或网络文件

    write函数#include<unistd.h>

    ssize_t write(int fd,const void* buf,size_t count);
    

    ​ fd:文件描述符

    ​ buf:存数据的缓冲区

    ​ count:缓冲区大小

    ​ 返回值:

    ​ 成功:读到的字节数

    ​ 失败:-1 设置errno

    错误处理函数

    ​ void perror(const char*s);

    ​ perror("open error ");

    补充strace命令 跟踪系统级调用

    系统调用和库函数比较——fputc和read

    image

    image

    缓冲区

    ​ read,write函数常常被称为 Unbuffered I/O。指的是无用户级缓冲区

    ​ fputc自带缓冲区,虽然每次读一个字节,但是这个字节是存在自己 的缓冲区里面,满了之后再送到内核区

    文件描述符

    PCB进程控制块:本质 结构体

    image
    struct task_struct{结构体}

    成员:文件描述符表

    文件描述符:0/1/2.../1024

    0-STDIN_FILENO

    1-STDOUT_FILENO

    2-STDERR_FILENO

    最大打开文件数:一个进程默认打开文件的个数是1024个

    ​ 命令查看:ulimit -a查看open files对应值。默认是1024

    ​ 修改i:ulimit -n 4096

    阻塞、非阻塞:是设备,网络文件的属性

    产生阻塞的场景:读设备文件(/dev/tty--终端文件)读网络文件。(读常规文件无阻塞概念)

    ​ open("/dev/tty",O_RDWR|O_NONBLOCK); ---设置/dev/tty/非阻塞状态,默认是阻塞状态

    fcntl函数

    int flags=fcnt(fd,F_GETFL);

    位图

    flags |=O_NONBLOCK;

    ​ 改变一个【已经打开】的文件的访问控制属性

    ​ F_GETFL 获取文件状态信息

    ​ F_SETFL 设置文件状态

    修改文件属性

    		flags=fcntl(fd,F_GETFL);
    
    		flags |=O_NONBLOCK;
    
    		fcntl(fd,F_SETFL,flags);
    

    lseek函数:文件偏移

    off_t lseek(int fd,off_t offset,int whence);

    参数:

    ​ fd:文件描述符

    ​ offset:偏移量

    ​ whence:起始偏移位置

    返回值:

    ​ 成功:起始位置偏移量

    ​ 失败:-1 errno

    应用场景:

    ​ 1.文件的“读”,“写”使用同一偏移位置

    ​ 2.使用lseek获取,拓展文件大小

    ​ 3.使用lseek拓展文件大小,想要真正的扩展,必须引起IO操作

    ​ 使用truncate函数,直接拓展文件大小 int ret=truncate("dict.cp",250);

    传入参数:

    ​ 1.指针作为函数参数

    ​ 2.常有const关键字修饰

    ​ 3。指针指向有效区域,在函数内部做读操作

    传出参数:

    ​ 1.指针作为函数参数

    ​ 2.在函数调用之前,指针指向的空间可以无意义,但必须有效

    ​ 3.在函数内部,做写操作

    ​ 4.函数调用结束后,充当函数

    传入传出参数:

    ​ 1+3:在函数内部做读写操作

    目录项和inode

    image

    stat函数(会穿透符号链接)

    ​ int stat(const char*path,struct stat *buf)

    参数:

    ​ path:文件路径

    ​ buf:(传出参数)存放文件属性

    返回值:

    ​ 成功:0

    ​ 失败:-1 errno

    获取文件大小:buf.st_size

    获取文件类型:buf.st_mode

    获取文件权限:buf.st_mode

    lstat函数(不会穿透符号链接)

    link函数

    ​ 创建硬链接(命令):ln t.c t.hard

    unlink函数

    ​ 清除文件时,如果文件的硬链接数到0了。没有dentry对应,但该文件不会立马释放,要等到所有打开该文件的进程关闭该文件,系统才会挑时间将文件释放掉

    readlink函数

    ​ 读取符号链接文件本身内容,得到链接所指向的文件名

    ​ ssize_t readlink(const char* path,char *buf,size_t bufsize);

    dup2函数

    #include <unistd.h>

    #include <fcntl.h>

    int dup2(int oldfd, int newfd);

    返回值:

    ​ 成功:新的文件描述符

    ​ 失败:-1

    目录操作

    DIR* opendir(char* name);

    int closedir(DIR *dp);

    struct dirent *readdir(DIR *dp);

    struct dirent {

    inode

    char name[256];

    }

     #include<stdio.h>
     #include<stdlib.h>
     #include<dirent.h>
     #include<unistd.h>
     
     int main(int argc,char *argv[])
     {
         DIR *dp;
         struct dirent *sdp;
         //打开目录
         dp=opendir(argv[1]);
         if(dp==NULL )
         {   
             perror("opendir error");
             exit(1);
         }   
     
         //读取目录并显示
         while((sdp=readdir(dp))!=NULL    ){  
             printf("%s	",sdp->d_name);
         }   
         printf("
    ");
     
     
         //关闭目录
         closedir(dp);
     
     
         return 0;
     } 
    
  • 相关阅读:
    Java设计模式之单例模式
    docker常用命令2
    Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate';
    Apache RocketMQ在linux上的常用命令
    RocketMQ的broker启动失败解决
    xshell与xftp使用注意
    Springboot项目打包成jar运行2种方式
    docker常用命令记录
    MySql常用语句总结更新
    springboot启动报错start bean 'eurekaAutoServiceRegistration' NullPointerException
  • 原文地址:https://www.cnblogs.com/hongweijiang/p/14514151.html
Copyright © 2020-2023  润新知