UNIX环境高级编程笔记-1

来源:互联网 发布:ubuntu系统联网 编辑:程序博客网 时间:2024/05/09 00:19

内核的接口称为系统调用。shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口。系统在其口令文件中查看登录名。

口令文件通常是/etc/passwd,口令文件中的登录项由7个以冒号分隔的字段组成,如
sar:x:205:105:Stephen Rago:/home/sar:/bin/ksh,分别是登录名,加密口令,数值用户ID,数值组ID,注释字段,起始目录,以及shell程序。
UNIX文件系统是由目录和文件组成的一种层次结构,目录的起点称为根(root),其名字是一个字符/,目录是一个包含许多目录项的文件。文件属性指的是文件类型(是普通文件还是目录),文件大小,文件的权限以及文件的最后修改时间。

目录中的各个名字称为文件名。不能出现在文件名字中的字符只有斜线(/)和空操作符。因为斜线用来分隔构成路径名,空操作符则用来终止一个路径名。

创建新目录时会自动创建两个文件名:.(称为点)和(..)(称为点-点)。点指当前目录,点-点则指父目录。在最高层次的目录中,点-点和点相同。

一个或多个以斜线分隔的文件名序列构成路径名,以斜线开头的路径名称为绝对路径名,否则称为相对路径名。如/etc是一个绝对路径名,而home/hkm/work是一个相对路径名。

每个进程都有一个工作目录,有时称为当前工作目录,所有相对路径名都从工作目录开始解释。系统登录时,工作目录设置为起始目录,该起始目录从口令文件中相应用户的登陆项中取得。

文件描述符:通常是一个小的非负整数,内核用它标识一个特定进程正在访问的一个文件。当内核打开一个已经存在或者创建一个新文件时,它返回一个文件描述符,在读写文件时可以使用它。

标准输入,标准输出和标准出错

每当运行一个新程序时,所有的shell都为其打开三个文件描述符:标准输入(standard input),标准输出,(standard output)和标准出错(standard error)。大多数shell可以提供一种方法,使其中任何一个或者三个能重定向到某个文件。如ls>fdile.tes

函数open,read,write,lseek以及close提供了不用缓冲的IO,这些函数都使用文件描述符。

标准IO函数提供一种对不用缓冲I/O函数的带缓冲数据的接口,使用标准I/O函数无需担心如何选取最佳的缓冲区的大小。

程序和进程

程序是放在磁盘上的,处于某个目录中的一个可执行文件。使用6个exec函数中的一个由内核将程序读入存储器。

程序的执行实例称为进程。每个进程有一个唯一的数字标识,称为进程ID,总是一个非负整数。

用于进程控制的函数有fork,wait,waitpid。

fork创建子进程,新进程是父进程的复制品,fork有两个返回值,fork向父进程返回新子进程的进程ID,对子进程返回0.

waitpid返回子进程的终止状态。

wait和waipid的区别以后再说。

在一个进程内的所有线程共享同一地址空间,文件描述符,栈以及与进程相关的资源。线程也用ID标识,但是线程只在它所属的进程内起作用,一个进程中的线程再另一个进程中并无意义。

 

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

errno的两条规则

1.如果没出错,其值不会被一个例程清除,仅当函数的返回值指明出错时,才检验其值。

2.任意函数都不会将errno值置为0.

C标准定义了两个函数:

#include <string.h>

char *strerror(int errnum)

将errnum(即errno的值)映射为一个出错的信息字符串,并且返回此字符串的指针。

#include <stdio.h>

void perror(const char *msg)

首先输出一个msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错,最后是一个换行符。

例如:EACCES: Permission denied

未完待续...................
0 0