登陆
1.登录名
系统在其 口令文件(通常是/etc/passwd文件) 中查看用户名,口令文件中包含了有关用户的信息。
2.shell
shell是一个命令解析器,读取用户输入的内容,然后执行命令。
文件和目录
1.文件系统
UNIX文件系统是 目录 和 文件 的一种层次结构。 所有 的起点成为根(root)目录, 根目录的名称是一个” / ”
目录 是一个包含目录项的文件。 可以认为每个目录项都包含一个文件名,同时还包含文件属性的信息(stat和fstat函数返回包含所有文件属性的一个结构)。
2.文件名
目录中的各个名字称为文件名(filename)。 创建目录时会自动创建两个文件名: . 和 .. 分别指向当前目录和父目录。
3.路径名
” / ” 开头称为绝对路径名, 否则都成为相对路径名。
相对路径名指向相对于当前目录的文件。
实例
列出一个目录中所有文件的名字。
#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 ((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp -> d_name);
closedir(dp);
exit(0);
}
-
-
-
- 包含 系统头文件 dirent.h 以便使用 opendir 和 readdir 的函数原型。
- opendir 函数返回 指向 DIR 结构的指针。 再将指针传给readdir函数。readdir函数返回一个指向dirent结构的指针。
-
-
4.工作目录
每个进程都有一个工作目录(working directory),或成为当前工作目录。所有相对路径名都从工作目录开始解释。
进程可以用 chdir 函数更改其工作目录。
5.起始目录
登陆时, 工作目录设置为起始目录(home directory) , 起始目录 从 口令文件 中 相应用户的 登陆项 中取得。
输入和输出
1. 文件描述符
文件描述符(file descripyor) 通常是一个 小的 非负整数 。
内核用以标识特定进程正在访问的文件。
当内核 打开 一个现有文件 或者 创建 一个新文件时, 都返回一个文件描述符。
在 读 或 写 文件的时候,可以使用文件描述符。
2. 标准输入,标准输出或标准错误
每当运行一个新程序时,所有的 shell 都为其打开 3个 文件描述符。既 标准输入(standard input),标准输出(standard output),标准错误(standard error)。
大多数 shell 都提供一种方法,使其中任何一个或所有描述符都能 重定向 到某个文件,例如:
ls > file.list
执行 ls 命令, 其 标准输出 重定向 到名为file.list 的文件中。
3. 不带缓冲的 I/O
函数 open, read, write, lseek, close 提供了不带缓冲的I/O。 都使用文件描述符。
实例
#include "apue.h"
#define BUFFSIZE 4096
int main(void)
{
int n;
char buf[BUFFSIZE];
while (( n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if( write(STOUT_FILENO, buf, n) != n)
err_sys("write error);
if(n<0)
err_sys("read error");
exit(0);
}
-
-
- 头文件<unistd.h> 包含 STDIN_FILENO 和 STDOUT_FILENO 常量。
- read函数返回读取的字节数,当达到输入文件的尾端时,read返回0,如果发生错误返回-1。
-
4. 标准I/O
标准I/O函数 为不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数不用考虑如何选最佳的缓冲区大小。
实例
使用标准输入和输出
#include "apue.h"
int main(void)
{
int c;
while (( c = getc(stdin)) != EOF)
if( putc(c,stdout) == EOF)
err_sys("output error");
if (ferror(stdin))
err_sys("input error");
exit(0);
}
函数getc一次读取一个字符,然后putc将此字符写到标准输出。
程序和进程
1. 程序
程序是一个存储在磁盘的可执行文件。 内核 使用 exec函数 将程序读入内存并执行。
2. 进程和进程ID
程序执行的实例被称之为进程(process)。
UNIX系统确保每个进程都有独立的 进程ID(非负整数)
getpid() 可以获取进程ID。
3. 进程控制
3个主要的进程控制函数 : fork , exec , waitpid 。 (exec函数有7个变体, 统称为exec函数)
4. 线程和线程ID
一个进程中的所有线程共享同一地址空间 , 文件描述符 , 栈 , 进程相关属性。
出错处理
<errno.h> 中定义了 errno 以及可以赋予它的各种常量。
这些常量都以字符E开头。
strerror( int errnum ) 函数将 errnum 映射为一个出错消息字符串,返回此字符串的指针。
perror( const char *msg ) 函数 在标准错误上产生错误信息。
用户标识
1. 用户ID
口令文件中, 每个用户有一个唯一的用户ID, root用户ID 为 0。
2. 组ID
口令文件中, 组文件 将 组名 映射为 数值的组ID。 组文件同常是 /etc/group
口令文件 包含了 登录名和用户ID之间的映射关系, 组文件包含了组名和组ID之间的映射关系。
getuid 和 getgid 分别返回 用户ID 和 组ID。
3. 附属组ID
一个用户属于最多16个其他的组。
登陆时, 读文件/etc/group 寻找列有该用户作为其他成员的前16个记录就可以得到该用户的附属组ID。
信号(signal)
信号用于通知进程发生了某种情况。
进程有3种处理信号的方式:
1.忽略信号
2.按系统默认方式处理(比如系统自动终止程序)
3.提供一个函数,信号发生时调用此函数。如: signal( ) 函数
时间值
1. 日历时间
指 自 1970年1月1日 00:00:00 这个时间开始缩经过的 秒数 累计值。
系统基本数据类型 time_t 用于保存这种时间值。
2. 进程时间
CPU时间 用来度量进程使用的CPU资源。
系统基本数据类型 clock_t 用于保存这种时间值。
系统调用和库函数
概括的来说,库函数就是对系统调用的进一步封装。