• Unix/Linux编程实践教程(0:文件、终端、信号)


    本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下。

     

    阅读联机帮助的一个示例:

     

    open系统调用:

    read系统调用:

    Unix的time:

    上面的printf可以看到,一个临时的char* 指针也可以+4,希望查看ctime函数里面是否有malloc,如果有的话由谁来释放内存???没有的话为什么可以指针操作。

    为解决上述疑惑,通过查看http://www.cplusplus.com/reference/ctime/ctime/以及及http://www.cplusplus.com/reference/ctime/asctime/,得到:

    ctime
    char* ctime (const time_t * timer);
    Convert time_t value to string
    
    This function is equivalent to: 
     
    asctime(localtime(timer))
    
    
    asctime
    char* asctime (const struct tm * timeptr);
    Convert tm structure to string
    
    It is defined with a behavior equivalent to:
    
    char* asctime(const struct tm *timeptr)
    {
      static const char wday_name[][4] = {
        "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
      };
      static const char mon_name[][4] = {
        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
      };
      static char result[26];
      sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d
    ",
        wday_name[timeptr->tm_wday],
        mon_name[timeptr->tm_mon],
        timeptr->tm_mday, timeptr->tm_hour,
        timeptr->tm_min, timeptr->tm_sec,
        1900 + timeptr->tm_year);
      return result;
    }

    疑惑解除了,可以看到ctime返回的是一个静态局部char数组。

     

    系统调用lseek改变打开文件位置:

     

    处理系统调用中的错误

    确定错误种类errno。

    显示错误信息perror:

    ls -a选项列出隐藏文件:

    怎么打开目录:

    如何编写ls:

    stat获取文件属性信息:

    其中stat的结构为:

     

    将模式字段转换为字符

    使用掩码得到文件类型:

     set-user-ID允许用户修改密码:

    sticky位:

    修改最后修改时间和最后访问时间:

    创建一个新文件的主要四个操作:

     

    目录的工作过程:

     

    mkdir、rmdir、rm(unlink)。unlink不能用来删除目录。

    命令ln使用系统调用link:

    mv命令有时候调用rename:

    rename的逻辑:

    cd命令使用系统调用chdir:

    spwd.c代码:

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<dirent.h>
    
    ino_t get_inode(char*);
    void printpathto(ino_t);
    void inum_to_name(ino_t,char *,int);
    
    int main()
    {
        printpathto(get_inode".");
        putchar('
    ');
        return 0;
    }
    
    void printpathto(ino_t this_inode)
    {
        ino_t my_inode;
        char its_name[BUFSIZ];
        if(get_inode("..")!=this_inode)
        {
            chdir("..");
            inum_to_name(this_inode,its_name,BUFSIZ);
            my_inode=get_inode(".");
            printpathto(my_inode);//注意这两行,是怎么实现递归,然后按照正确顺序打印目录的
         printf("/%s",its_name); } }
    void inum_to_name(ino_t inode_to_find,char *namebuf,int buflen) { DIR *dir_ptr; struct dirent *direntp; dir_ptr=open("."); if(dir_ptr==NULL){ perror("."); exit(1); } while((direntp=readdir(dir_ptr))!=NULL) { if(direntp->d_ino==inode_to_find) { strncpy(namebuf,direntp->d_name,buflen); name[buflen-1]=''; closedir(dir_ptr); return; }
      } fprintf(stderr,
    "error looking for inum %d ",inode_to_find); exit(1); } ino_t get_inode(char *fname) { struct stat info; if(stat(fname,&info)==-1){ fprintf(stderr,"Cannot stat "); perror(fname); exit(1); } return info.st_ino; }

    列出这段代码,除了要注意递归外,就是要留意几个结构体DIR 、struct direntstruct stat以及它们的使用方法,可以参考收藏“Linux下DIR,dirent,stat等结构体详解”:http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/

     在上面的代码中,对while((direntp=readdir(dir_ptr))!=NULL)是怎么遍历目录中文件的,还不是很清楚,必要的时候再去读一下readdir的源码。可能DIR结构体中包含一个当前已读取目录的记录吧?可能跟MFC里面的FindNextFile函数差不多。

     这个spwd程序似乎在挂载的vtid部分目录里运行时不能成功,不知道跟文件系统、挂载有没有关系。

    硬连接和符号连接:

     系统调用fcntl控制文件描述符:

     stty命令的相关参数及使用:

    其中,termios结构类型:

    设备文件的系统调用ioctl

    Ctrl+C是如何工作的:

    信号 

    生成信号的请求来自3个地方:

    常见信号类型:

    signal信号处理函数:

     基本curses函数:

     

    进程设置闹钟后挂起:

    Unix的3种时间:

    计时器的struct itimerval结构:

    计时器的实现原理:

    系统调用getitimer和setitimer:

    处理多个信号:sigaction:


    其中,sigaction结构体:

    sigaction的用法示例:

    阻塞信号系统调用sigprocmask:

    暂时阻塞信号示例:

    kill:从另一个进程发送的信号:

     

  • 相关阅读:
    Oracle 异常处理
    Oracle 游标的使用
    jdbc 连接数据库
    从0开始疫情3D地球
    从0开始疫情3D地球
    从0开始疫情3D地球
    从0开始疫情3D地球
    从0开始疫情3D地球
    从0开始疫情3D地球
    简明 ASP.NET Core 手册问题记录
  • 原文地址:https://www.cnblogs.com/ph829/p/5901133.html
Copyright © 2020-2023  润新知