Unix基础知识

博客搬家,原地址:https://langzi989.github.io/2017/05/22/Unix基础知识/

Unix体系结构

从严格意义上讲,可以将操作系统定义为一种软件,它相当于一种控制计算机硬件资源,为程序提供运行环境的软件。我们通常将这种软件叫做内核,因为它相对比较小,并且位于环境的核心。Unix体系结构如下图:
Unix基础知识

内核的接口被称为系统调用(system Call),公共库函数建立在系统调用接口之上,**应用程序既可以使用公共函数库,也可以使用系统调用。**shell是一个特殊的应用程序,为运行其他应用程序提供了接口。

Unix文件和目录

文件系统

Unix文件系统是文件和目录的一种层次结构,所有文件的起点都是根目录(root),名称为"/".

目录是一个包含目录项的文件。逻辑上,可以认为每个目录项都包含一个文件,同时还说明该文件属性的信息。文件属性包括文件类型(普通文件还是目录)、文件权限、;链接到改文件的进程数、文件所有者、文件所有者所在的组 文件大小以及文件最后修改的时间等。stat和fstat函数返回一个文件属性的信息结构。

#include <sys/stat.h>

//通过文件名获取文件信息,并保存在buf所指的结构体stat中
//返回值:成功返回0,失败-1,错误码存在errno中
int stat(const char* file_name, struct stat* buf);

数据类型:
struct stat {
dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/  

ino_t       st_ino;     /* inode number -inode节点号*/  

mode_t      st_mode;    /* protection -保护模式?*/  

nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/  

uid_t       st_uid;     /* user ID of owner -user id*/  

gid_t       st_gid;     /* group ID of owner - group id*/  

dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/  

off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/  

blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/  

blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/  

time_t      st_atime;   /* time of last access -最近存取时间*/  

time_t      st_mtime;   /* time of last modification -最近修改时间*/  

time_t      st_ctime;   /* time of last status change - */  
}

使用C语言实现ls功能

涉及到的相关函数:

  • 文件夹操作函数opendir,readdir,closedir
  • opendir返回指向dir结构的指针,将该指针传递给readdir,无需关心dir结构中存在什么数据,直接读取即可。
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>

void err_quit(const char* message) {
  printf("%s\n", message);
  exit(0);
}
int main(int argc, char *argv[])
{
  if (argc < 2)
  {
    err_quit("usage: ls directory_name\n");
    exit(0);
  }

  DIR *dp;
  struct dirent *dirp;

  if ((dp = opendir(argv[1])) == NULL)
    err_quit("can not open file\n");

  while ((dirp = readdir(dp)) != NULL)
    printf("%s\n", dirp->d_name);
  closedir(dp);
  return 0;
}

输入和输出

文件描述符

文件描述符是一个很小的非负整数,内核用文件描述符来标识一个特定进程正在访问的文件。当内核打开或创建文件时,他都会返回一个文件描述符。在读写文件时,都可以使用这个描述符(根据打开时的模式赋予权限).

标准输入、标准输出和标准错误流

按照惯例,每当运行一个新程序的时候,所有的shell都会为改程序默认打开三个文件描述符,即标准输入,标准输出和标注错误。如果不做特殊处理,这三个描述符都连接到终端,也可以将其重定向到文件。如ls > test.data