UNIX环境高级编程学习笔记 第一章 UNIX基础知识

第一章 UNIX基础知识

1.2 UNIX体系结构

在这里插入图片描述

1.3 登录

  1. 登录名:
    口令文件(/etc/passwd文件)中的登录项由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID、数字组ID、注释字段、起始目录(/home/sar)以及shell程序(/bin/ksh)。
    在这里插入图片描述
    2.shell
    shell是一个命令行解释器,它读取用户输入,然后执行命令。shell的用户输入通常来自于终端(交互式shell),有时则来自于文件(称为shell脚本)。
    在这里插入图片描述
    系统从口令文件中相应用户登录项的最后一个字段中了解到应该为该登录用户执行哪一个shell。

1.4 文件和目录

列出一个目录中的所用文件

#include "apue.h"
#include <dirent.h>

int main(int argc, char *argv[])
{
	DIR *dp;
	struct dirent *dirp;
	if (argc != 2)
		err_quit("usage:ls directory_name");
	if ((dp = opendir(argv[1])) == NULL)
		err_sys("can't open %s", argv[1]);
	while (NULL != (dirp = readdir(dp)))
		printf("%s\n", dirp->d_name);
	
	closedir(dp);
	exit(0);
}

1.5 输入和输出

  1. 文件描述符
    文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。

  2. 标准输入、标准输出和标准错误
    ls > file.list
    执行ls命令,将标准输出重定向到file.list文件中。

  3. 不带缓冲的I/O

#include "apue.h"
#define BUFFSIZE 4096

int main(void)
{
   int n;
   char buf[BUFFSIZE];
   while((n = read(STDIN_FILEND, buf, BUFFSIZE)) > 0)
       if (write(STDOUT_FILENO, buf, n) != n)
           err_sys("write error");
   if (n > 0)
       err_sys("read error");
   exit(0);
}
./a.out < infile > outfile

将infile文件的内容复制到名为outfile的文件中。

1.6 程序和进程

  • 程序
    程序是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数(7个exec函数之一),将程序读入内存,并执行程序。
  • 进程和进程ID
    程序的执行实例被称为进程。UNIX系统确保每个进程都有一个唯一的数字标识符,称为进程ID。进程ID总是一个非负整数。
  • 进程控制
    有3个用于进程控制的主要函数:fork、exec和waitpid。(exec函数有7种变体,但经常把它们统称为exec函数。)
  • 线程和线程ID
    一个进程内的所用线程共享同一个地址空间、文件描述符、栈以及与进程有关的属性。因为它们能访问同一存储区,所以各线程在访问共享数据时需要同步措施以避免不一致性。

1.7 出错处理

当UNIX系统函数出错时,通常会返回一个负值,而且整形变量errno通常被设置为具有特定信息的值。文件<errno.h>中定义了errno以及赋予它的各种常量。这些常量都以字符E开头。

1.8 用户标识

  • 用户ID
    口令文件登录项中的用户ID是一个数值,它向系统标识各个不同的用户。用户不能更改其用户ID。跟用户或超级用户的用户ID为0。
  • 组ID
    口令文件登录也包括用户的组ID,组ID是由系统管理员在指定用户登录名时分配。组文件将组名映射为数值的组ID。组文件通常是/etc/group。

1.9 信号

信号同于通知进程发生了某种情况。进程有3种处理信号的方式:

  • 忽略信号
  • 按系统默认方式处理
  • 提供一个函数,信号发生时调用该函数
    终端键盘上有两种产生信号的方法,分别称为中断键(通常是Delete键或Ctrl+C)和退出键(通常是Ctrl+\),它们被用于中断当前运行的进程。另一种产生信号的方法是调用kill函数。在一个进程中调用此函数就可向另一个进程发送一个信号。

1.10 时间值

历史上,UNIX系统使用过两种不同的时间值。

  • 日历时间。该值是自协调世界时1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值。系统基本数据类型 time_t 用于保存这种时间值。
  • 进程时间。也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴答计算。系统基本数据类型 clock_t 保存这种时间值。
    当度量一个进程的执行时间时,UNIX系统为一个进程维护了3个进程时间值:
  • 时钟时间
  • 用户CPU时间
  • 系统CPU时间
    时钟时间又称为墙上时钟时间,它是进程运行的时间总量,其值与系统中同时运行的进程数有关。每当在本书中提到时钟时间时,都是在系统中没有其他活动时进行度量的。
    用户CPU时间时执行用户指令所用的时间量。
    系统CPU时间是为该进程执行内核程序所经历的时间。
    可用命令time(1)来获取任一进程的时钟时间、用户时间和系统时间,例如:
    在这里插入图片描述

1.11 系统调用和库函数

在这里插入图片描述
系统调用通常提供一个最小接口,而库函数通常提供比较复杂的功能。

发布了3 篇原创文章 · 获赞 0 · 访问量 76

猜你喜欢

转载自blog.csdn.net/weixin_43313383/article/details/103603029