一、UNIX基础知识(1)

2023-12-15 11:28:26

注释:本系列文章基于《UNIX环境高级编程》,是作者在学习UNIX过程中的一些总结。


前言

UNIX系统是一种操作系统家族,包括多个衍生版本,如Linux、macOS和FreeBSD等。UNIX系统具有多用户、多任务、分时操作和强大的命令行接口等特点,由贝尔实验室于20世纪70年代开发。

在UNIX系统中,文件和目录管理是一个核心概念。文件系统以层次结构的方式组织文件和目录,并使用路径来指定它们的位置。UNIX系统中的文件和目录都遵循一套权限模型,控制着对它们的访问和操作。

UNIX系统提供了丰富的命令行工具和实用程序,可以执行各种任务,如文件操作、进程管理、网络通信、软件安装等。用户可以通过命令行终端或图形界面来与UNIX系统进行交互。

另外,UNIX系统还支持多用户环境,允许多个用户同时登录并共享系统资源。每个用户都有自己的账户和权限,可以独立地进行操作和管理。

UNIX系统以其稳定性、可靠性和灵活性而闻名,并广泛用于服务器、工作站和嵌入式系统等各种计算领域。


一、UNIX体系机构

UNIX主要由内核、系统调用、shell、公用函数库以及应用程序组成。

内核:UNIX内核是UNIX操作系统的核心部分,它负责管理和控制硬件资源、提供系统调用接口以及处理进程调度等操作。UNIX内核在操作系统中起着重要的作用,它提供了各种功能和服务,使得其他应用程序能够运行在UNIX系统之上。

UNIX内核的主要功能包括:
进程管理:UNIX内核负责创建、终止和调度进程。它管理进程的运行状态、分配资源、设置优先级等。
内存管理:内核管理系统的内存资源,包括分配和释放内存、虚拟内存管理、页面置换等。
文件系统:内核提供文件系统接口,管理文件和目录的创建、读写、权限控制等操作。
设备管理:内核管理计算机的设备,包括输入输出设备、网络设备、磁盘驱动器等。它提供设备驱动程序,并处理设备的初始化、读写和中断等操作。
网络通信:内核支持网络协议栈,处理网络通信的数据包收发、路由、连接管理等。
系统调用接口:内核提供一组系统调用接口,使应用程序可以利用内核提供的功能和服务。

UNIX内核的具体实现取决于不同的UNIX操作系统版本,如Linux内核是基于UNIX设计原则的开源内核,而macOS使用的是基于BSD的UNIX内核。每个UNIX内核都有自己的特点和设计理念,但它们共同遵循UNIX哲学,注重简单性、可组合性和可扩展性。

系统调用:系统调用是操作系统提供给应用程序访问内核的接口,应用程序可以通过系统调用请求操作系统执行特权操作,如文件操作、进程管理、网络通信等。通过系统调用,应用程序能够利用操作系统的功能来完成各种任务。

编程语言通常提供了封装系统调用的高级API,使开发者可以更方便的使用系统调用。例如,C语言提供的标准库函数(如open()、read()、write()等)在底层会调用适当的系统调用来完成相应的操作。

shell:shell是一个特殊的应用程序,为运行其它应用程序提供了一个接口。其中shell脚本是一种由shell命令组成的文本文件,用于自动化和批量执行任务。
windows系统powershell
公用函数库:在UNIX系统中,有一些常用的函数库被广泛使用。这些函数库提供了许多通用功能的函数,可以方便地在应用程序中使用。以下是UNIX系统中一些常见的公用函数库:

C标准函数库(C Standard Library):包括在C语言中定义的标准函数,如字符串处理函数、内存操作函数、文件操作函数等。这些函数库通过#include<stdlib.h>、#include <stdio.h>等头文件进行引用。

POSIX函数库(Portable Operating System Interface):POSIX是一种UNIX系统接口标准,定义了许多与操作系统交互的函数和接口。POSIX函数库提供了对文件操作、进程管理、线程控制、信号处理、时间处理等方面的支持。这些函数库通过#include <unistd.h>、#include <pthread.h>等头文件进行引用。

Socket编程函数库:用于网络通信的函数库,提供了创建套接字、发送和接收数据、建立网络连接等网络相关的函数。常见的Socket编程函数库有BSD Socket(<sys/socket.h>)、Winsock(Windows平台)等。

数学函数库(Math Library):提供了数学运算的函数,如三角函数、指数函数、对数函数等。UNIX系统中常用的数学函数库是数学库(<math.h>),它提供了一系列的数学函数。

字符串处理函数库:提供了对字符串的处理和操作函数,如字符串复制、拼接、查找、比较等。常用的字符串处理函数库是字符串库(<string.h>)。

时间和日期函数库:提供了获取当前时间、日期格式化、时间计算等与时间和日期相关的函数。常见的时间和日期函数库包括时间库(<time.h>)。

除了上述函数库外,还有许多其他的函数库和工具库,用于特定的领域和功能,如图形界面开发(Xlib、GTK+、Qt)、数据库访问(libpq、ODBC)、加密解密(OpenSSL)、图像处理(ImageMagick)、多媒体处理(FFmpeg)等。

这些公用函数库是UNIX系统中常用的函数库之一,可以帮助开发者更方便地实现各种功能,并加快应用程序的开发过程。

应用程序:UNIX上执行特定功能的软件,通过系统调用访问内核从而实现目的。如shell就是一种应用程序。

体系结构图

二、文件和目录

1.文件系统

UNIX文件系统是文件和目录的一种层次结构,所有东西的起点都是根目录,这个目录由“/”表示。文件目录形成一个树状结构,最顶层即为根目录。如下图为Cenos7的文件系统:
文件系统

2.文件名

目录中的各个名字即为文件名,只有“/”和空字符不能出现在文件名中。“/”用来分隔构成路径名的各个文件名,空字符则用来终止一个路径名。例如:
路径

"."指向当前目录,两个”.“则指向父目录。
UNIX文件目录的常见命令如下:
pwd(Print Working Directory):显示当前工作目录的路径。
cd(Change Directory):切换到指定的目录。示例:cd /path/to/directory
ls(List):列出当前目录中的文件和子目录。常用选项包括-l(详细信息)、-a(显示隐藏文件)、-h(以人类可读的格式显示文件大小)等。示例:ls -l
mkdir(Make Directory):创建一个新的目录。示例:mkdir directory_name
rmdir(Remove Directory):删除一个空的目录。示例:rmdir directory_name
rm(Remove):删除文件或目录。常用选项包括-r(递归删除,删除目录及其内容)和-f(强制删除,不提示确认)。示例:rm file_namerm -rf directory_name
cp(Copy):复制文件或目录。常用选项包括-r(递归复制,复制目录及其内容)。示例:cp file_name destinationcp -r directory_name destination
mv(Move):移动文件或目录,或者给文件或目录重命名。示例:mv old_name new_namemv file_name /path/to/destination
find:在指定目录及其子目录中查找文件。常用选项包括-name(按文件名查找)、-type(按类型查找,如文件或目录)等。示例:find /path/to/directory -name file_name
chmod(Change Mode):修改文件或目录的权限。示例:chmod permissions file_namechmod permissions directory_name

3. 路径名

绝对路径:以”/“开头的路径名,从根文件夹开始描述某个文件和目录的完整路径,包括所有级别的目录和子目录,直到达到所需文件或目录。
相对路径:从当前所在目录开始描述某个文件或目录的路径。例如,在UNIX中,如果当前工作目录是/home/user,要访问/home/user/documents/file.txt这个文件,可以使用相对径./documents/file.txt或者../user/documents/file.txt

实例

myls.c(实现unix ls指令功能)

#include "apue.h"
#include <dirent.h>  //定义了目录操作相关的函数和结构体

int main(int argc,char *argv[]){  //args表示命令行参数,argv是一个字符串数组,保存了命令行参数的值
    DIR *dp;   //指向DIR类型的指针
    struct dirent *dirp;  //指向struct dirent类型的指针。结构再dirent中有定义
    if(argc!=2){  //检查命令行参数是否为2,不是则退出程序并输出相应内容
        err_quit("usage: ls directory_name");
    }
    if((dp=opendir(argv[1]))==NULL){  //opendir打开指定目录,返回NULL则err_sys
        err_sys("can't open %s",argv[1]);
    }
    while((dirp=readdir(dp))!=NULL){ //readdir逐个读取目录项,并打印目录名称
        printf("%s\n",dirp->d_name);
    }

    closedir(dp);  //关闭目录
    exit(0);
}

首先建立一个在系统中建立一个文件夹:unix_learn

mkdir unix_learn

转到unix__learn文件夹中

cd unix_learn
mkdir unit1   //第一单元
vi myls.c   //建立myls.c文件,把代码在这里面进行编辑

编译myls.c ,报错
在这里插入图片描述
这是因为apue是作者自己编写的函数库,我们需要将其与本地代码进行链接
源代码下载
解压下载的文件

tar -zxv -f src.3e.tar.gz   //会有一个apue.3e文件夹
cd apue.3e
make
cp ./include/apue.h /usr/include/  
cp ./lib/libapue.a /usr/local/lib/  //环境配置完毕

再编译

gcc myls.c -o myls -l apue  

生成myls
在这里插入图片描述
运行:

./myls /root

结果展示:
在这里插入图片描述

4.工作目录

工作目录是指当前正在进行操作的目录,也称为当前目录或当前工作目录。在进程中,工作目录是程序执行时默认使用的目录。可以使用getcwd获取当前工作目录的路径

总结

今天总结了《unix高级环境编程》的第一章的前四个小节,后续还会继续更新,争取每天更新,本部分内容链接部分讲得不是很清晰,后续会有相管内容总结。

文章来源:https://blog.csdn.net/weixin_45837967/article/details/132740273
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。