UNIX的高级编程环境.docx
- 文档编号:28054105
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:35
- 大小:55.27KB
UNIX的高级编程环境.docx
《UNIX的高级编程环境.docx》由会员分享,可在线阅读,更多相关《UNIX的高级编程环境.docx(35页珍藏版)》请在冰豆网上搜索。
UNIX的高级编程环境
1.1文件系统的内部结构
硬件:
在硬件上,把磁盘划分为一连串的块,块的大小从512到4096个字节都有可
能,完全依系统而定
文件系统在磁盘上的分布:
|引导块|超级块|I节点表|数据块|
1.引导块的内容:
文件系统的大小
可供使用的存储块的总数以及可供使用的块所组成的连接列表.
超级块是否被修改过,修改过,当核心程序执行sync指令时,会把主存中的超
级块写回磁盘里.
文件系统与磁盘的逻辑名称
可供使用的I节点总数及能够使用的I节点所组成的连接列表
最近一次I节点被修改的时间
2.i节点的内容:
文件的存取权限(用一个16位的字段表示)
位元
符号常数
含义
15
S_IFREG
一般文件
14
S_IFDIR
13
S_IFCHR/S_IFBLK
字符或块设备
12
S_IFIC
命名管道
11
S_ISUID
用户标识符是否被设定
10
S_ISGID
用户组标识符是否被设定
9
S_ISVTX
是否被置换
0~8
Rwx-rwx-rwx
文件存取权限
注:
其中12位到15位是用来判别文件类别,它们在文件建立时就已经设定
完成,而且不能被更改
S_ISUID:
当一个文件被建立时,文件的用户标识符(userID)与用户组标符
(groupID)被系统设置.当一个用户签到进入UNIX系统时,其用户标识符
(userID)与用户组标识符(groupID)被系统设置,当一个文件被执行时,该
进程会被给定两个标识符:
真实用户标识符与有效用户标识符.其中真实
用户标识符为文件的用户标识符,有效用户标识符随S_ISUID的不同的
设定而不同.其中如S_ISUID为off,则有效用户标识符与真实用户标识
符相同.如S_ISUID为on,则有效用户标识符为运行该文件的用户的用户
标识符.有效用户标识符标识的用户享有与真实用户标识符标识的用户相
同的权利.例如:
真实用户标识的用户对文件拥有读写的权利,则有效用户
标识的用户也对该文件享有读写的权利.在系统中,S_ISUID能设为on的
文件不能超过50个
S_ISUID的设定:
chmodrwsrwxrwx第三位不是x而设为s
S_ISGID同S_ISUID,但是指用户组
S_ISGID的设定:
chmodrwxrwsrwx第六位不是x而设为s
S_ISVTX(是否被置换):
当该位被置为1时,该文件被装入内存后,形同
DOS的TSR程序,将常驻内存.
S_ISVTX的设定:
chmodrwtrwxrwx第三位不是t而设为s
文件存取权限的设置:
格式一:
rwxrwxrwx
格式二:
八进制
意义
0400
允许文件主读
0200
允许文件主写
0100
允许文件主执行
0040
允许组读
0020
允许组写
0010
允许组执行
0004
允许其它人读
0002
允许其它人写
0001
允许其它人执行
04000
同S_ISUID
02000
同S_ISGID
01000
同S_ISVTX
注:
设置时用其中的八进制数相加值进行设置即可
如0400+0200=0600即为文件主可读写
文件的所有者标识
文件的实际存储地址
文件的存取时间:
最近被修改的时间,指文件最近一次被写入或删除数据
的时间
最近被访问的时间,指最近一次被访问的时间
最近文件模式被更改的时间,指I节点的内容被修改的
时间,会影响到I节点的指令有chmod,chown等
文件有多少个连接
文件的大小
文件的类型:
一般文件,目录文件,字符设备,块设备和FIFO(命名管道).
3.内存中的I节点,内存中的I节点除保留了文件中的I节点的内容外,还会增加四
项数据:
I节点被存取的状态,比如I节点被锁定或明或I节点被修改过
有多少个进程在使用该文件及其I节点
现在文件指针所指的位置.换言之,下批数据将由此开始读入
I节点所在的磁盘设备标识符(deviceID)
4.如何通过I节点表索引文件在磁盘上的位置(略)
1.2文件系统调用
类型
函数
用途
文件基本操作
Open
打开文件
Creat
建立并打开文件
Close
关闭文件
Read
读文件
Write
写文件
lseek
移动文件指针
fcntl
读取并控制文件的信息
文件存取权限的改变
Access
查看文件的存取权限
Chmod
改变文件的存取权限
Chown
改变文件的所有者,所属组
文件链接操作
Link
文件链接
Unlink
删除文件链接
获取文件系统信息
stat
获取文件的系统信息
Fstat
同上
目录操作
chdir
改变当前工作目录
mkdir
建立目录
rmdir
删除目录
mknod
建立目录与特殊文件
chroot
改变文件系统的起点
ftw
扫描当前目录树
文件卷操作
mount
文件系统的装载
unmount
文件系统的卸载
sync
把缓冲区内容送到磁盘
1.#include
intfd;
intopen(char*,int,int)
fd=open(fname,flags,perms);
fname:
可以是绝对路径,也可以是相对路径
flags:
O_RDONLY打开文件用于读
O_WRONLY打开文件用于只写
O_RDWR打开文件用于读写
O_APPEND同fopen的”a”模式
O_NDELAY立即打开不做任何耽搁
O_TRONC写入前先删除原有数据
O_CREAT如果该文件不存在,则建立之,并要求给予存取权限参数
Perms
O_EXCL如果目的文件已经存在,那么若以写入模式打开该文件,
则open()调用失败
O_NOCTTY如果此标志被设定,而打开的文件为设备文件(主要指
终端),则该终端不可以作为调用open()系统调用的哪个
进程的控制终端
其中前三项符号常量是互斥的,其余的若以无意义的组合,则系统不做处
理
perm:
例如0666
fd:
成功0–19的整数
失败-1
2.#include
intcreat(char*,int)
fd=creat(filename,perms)
filename:
是指要打开的文件名称
perms:
指打开后的文件的存取权限的设置
fd:
打开成功后的文件描述符
成功,打开后的蛙文件描述符
失败,-1
功能:
1.用creat打开的文件只能用于写操作;
2.filename可以为一个已存在的文件,此时perms无意义,fd为打开此文件
后的文件句柄
3.如filename为一个不存在的文件,则creat建立并打开此文件,并把该文
件截为空,此时perms为该文件的存取权限
3.#include
intclose(intfd)
fd:
用open或creat打开的文件的句柄
creat成功返回值为0,失败返回值为-1
4.#include
intnum_read=read(intfd,char*buf,intbufsize)
intnum_write=write(intfd,char*buf,intbufsize)
fd:
文件描述字
buf:
输入输出缓冲区
bufsize:
每次调用read/write时必须读写的字节数量,最小值为1
num_read:
如果是0表示EOF,若是-1则指读取过程有误.一般情形返回值是读
取的字节总数(该总数可能小于bufsize),不过EOF与回车符不算在被
读入字节总数中
num_write:
返回-1,指写的过程出错,否则返回的是写的字节数(该总数可能小于
bufsize)
补充:
1.如果write写入的对象为文本文件时,在遇到换行符时,它会输出换行符
与回车符(0D0A),而read的操作在读到换行符与回车符时转换为换行符
2.通过设定不同的bufsize可改变读写速度,在stdio.h中的符号常量
BUFSIZ是磁盘块的长度
3.write在进行写操作时仅能覆盖从当前文件指针到bufsize这么长的一
部分字符,文件其余的字符仍然存在
4.文件在read/write操作时,系统保留一文件指针指向当前文件操作位置
5.#include
longlseek(intfd,longoffset,intorigin)
fd:
文件描述符
offset:
每一读写操作所需移动的距离,这个值可正可负,正值向前移,负值指向后
移.
origin:
当前位置的基点:
0当前位置为文件的开头
1指当前位置为前一个位置加上偏移量
2当前位置为文件的尾端
返回值:
从文件头到现在正要读写的位置之间的字节总数;失败,返回-1
补充:
1.因为文件的长度可能大于正型变量的值,所以用long
2.只有当第三个参数是1或2时,偏移才可以为负值
3.新的当前位置可超过文件尾,此时对读是没意义的;但对于写,它将导致
文件的扩展,在新位置与原文件尾部之间,在进行读操作时,读到的将是
null字符(0x00)
4.如打开文件时,存取模式设为只读(O_RDONLY),则lseek将不允许当前
位置设定成超过文件尾
5.在unistd.h中定义了SEEK_SET(0),SEEK_CUR
(1),SEEK_END
(2)三个
符号常量供参数使用
6.#include
intstat=link(char*oldlink,char*newlink)
oldlink:
原文件名
newlink:
新文件名
stat:
成功,返回0
失败,返回-1
7.#include
intstat=unlink(char*filename)
8.#include
intstat=fcntl(intfd,intcmd,intoparg)
9.#include
intstat(char*path,structstat*buf)
intfstat(intfd,structstat*buf)
path:
为目标文件的完整路径
fd:
为打开的文件描述符
structstat
{
dev_tst_dev;/*磁盘设备的标识符*/
ino_tst_ino;/*文件I节点的值*/
unsignshortst_mode;/*文件存取权限为的设定状态*/
nlink_tst_nlink;/*文件有多少个连接*/
uid_tst_uid;/*文件所有者的用户标识符*/
gid_tst_gid;/*文件所有者的用户组标识符*/
dev_tst_rdev;/*只有当目标文件是设备文件时本栏才有意
义.它指示该文件所指向设备的标识符*/
off_tst_size;/*文件的长度,设备文件长度为0*/
time_tst_atime;/*最近一次文件被访问的时间*/
time_tst_mtime;/*最近一次文件被修改的时间*/
time_tst_ctime;/*最近一次文件属性被修改的时间*/
};
10.#include
intstat=access(char*path,intamode)
path:
为完整路径名;若无完整路径名,则为当前路径
amode:
从0到7.如图
modebinarycodecheckfor
04100read
02010write
01001execute/search
00000existence(存在)
将04与02按位”OR”可得06(110),表示可读写
stat:
成功0(表示文件有amode指定的属性)
失败–1
11.#include
intchmod(constchar*path,mode_tmode)
补充:
1.文件被打开时,不能用chmod改变文件属性
2.只有文件主与超级用户才有权执行此系统调用
例如:
chmod(“/tmp/tdb”,0755)
12.#include
intchown(char*path,intuid,intgid)
同chmod()
13.#include
intchdir(char*path)
path:
目标路径名
补充:
1.chdir的调用者必须有目标目录的搜寻权(x为on),否则调用会失败
14.#include
intrmdir(constcharpath)
#include
#include
intmkdir(constchar*path,mode_tmode)
mode:
为将建立的目录的存取权限
2.1标准I/O库
1.流和FILE结构
.流只是一个程序与一个打开文件之间的数据流.流是数据,不是通道
.程序中用一个指向FILE结构类型的指针来标识流,FILE的结构如下:
typedefstruct_iobuf{
int_cnt;
unsignedchar*_ptr;
unsignedchar*_base;
char_flag;
char_file;
}FILE
_file:
当流与一个文件发生关联时,用来保存文件描述符
_flag:
含有流的控制信息,例如,它可以指出流是否已打开用于读,用于
写,用于读写
_cnt,_ptr,_base:
描述了与打开的流有关的字符缓冲区._base指出这个缓
冲区的开始位置;_ptr指出缓冲区中下一个处理字符的位
置;_cnt指出_ptr所指位置后缓冲区中剩下字符的个数.
缓冲区的长度为BUFSIZ个字符.
.对于一个流进行读写的所有数据都要通过缓冲区来传送.如当写数据时,只有当
缓冲区满了,才向磁盘写数据;当读数据时,只有缓冲区空了,才从磁盘读数据.以
此来提高读写数据
2.2标准I/O库函数
1.#include
FILE*stream;
char*filename,*type;
intretval;
stream=fopen(filename,type);
retval=fclose(stream);
type可以取下列基本值:
r:
打开filename用于读,如该文件不存在,调用失败,返回NULL
w:
建立filename用于写,同时它被截为空
a:
打开filename用于只写,被写入的文件被追加到文件尾部.如果文件不存
在,则建立文件用于只写
一个文件也能被打开用于修改,即程序能同时对这个文件进行读写操作.但
因为I/O库的缓冲机制,所以,在输出操作后不能立即进行输入操作,除非中
间插入fseek,fflush或rewind操作.
r+:
打开文件filename用于读写,如果文件不存在,fopen将失败
w+:
建立filename,或把它截为空文件,并打开它用于修改
a+:
打开文件用于修改,写入的数据被追加到文件尾部.如果文件不存在,它将
被建立并打开用于读写
以上的只能用于字符操作,以下的能用于二进制操作
rb,wb,ab,rb+,wb+,ab+
stream:
成功,为一指向FILE的指针
失败,返回NULL(NULL在stdio.h中定义)
补充:
1.在进程中,fclose并不是必须的,在进程结束时,系统将自动关闭打开的文
件,并且如调用exit(),则将缓冲区的内容自动写到磁盘上;如不调用exit,
则此时在缓冲区的内容不会被写到磁盘上
2.在进程中如调用了fopen(),为了安全性,则结束时,必须调用fclose()或
exit();
2.#include
FILE*stream;
intretval;
retval=fflush(stream);
retval:
成功,返回0
失败,返回EOF(EOF在stdio.h中定义,表示文件结束)
补充:
1.调用该函数后,不管缓冲区是否满,将立即把缓冲区的内容写到文件中
3.#include
FILE*inf,*outf;
intc;
c=getc(inf);
putc(c,outf)
c:
失败,返回EOF(-1),表示到达文件尾或发生错误
注:
getc,putc是宏
4.#include
FILE*stream;
Intc,retval;
retval=ungetc(c,stream);
retval:
失败,返回EOF,如果要把EOF插回流中,肯定会失败
补充:
1.c必须是用getc从缓冲区中读的一个字符(其中EOF是不能被getc读出
的,所以把EOF插回流中,必定会失败)
2.ungetc主要用于getc多读一个字符后,把该字符回退到缓冲区中
5.#include
getchar()=getc(stdin);
putchar(c)=putc(c,stdout)
.输出到stderr的字符是不经过缓冲区的,但stdin,stdout是需要经过缓冲区
6.#include
intretval,fd;
FILE*stream;
retval=ferror(stream)
retval=feof(stream)
clearerr(stream)
fd=fileno(stream)
ferror:
如果前面的输入输出发生错误,则ferror返回一个非零值;返回0,表示没
有出错
feof:
当在stream中已达到文件末时,返回非0;返回0,则表示没有达到文件末
clearerr:
它把stream的错误标志和文件末指示清为0.它能保证将来对这个流
的ferror和feof调用,在未发生异常情况返回时返回0值
fileno:
返回stream所指FILE结构中的文件描述符,但不能用fileno把对文件的
系统调用和标准I/O例行程序混合使用
7.#include
char*buf,*retstring;
FILE*inf;
intnsize;
retstring=gets(buf)
retstring=fgets(buf,nsize,inf)
gets:
从标准输入流stdin中读取一个字符行,并把它放入buf指向的缓冲区
中.gets读出字符至换行符或文件末止,然后把换行符丢掉,把null(\0)符
加入缓冲区中,形成一个以null符结尾的字符串.如果gets调用成功,它
返回一个指向buf的指针;如果出错或到达文件末,则返回NULL
fgets:
从流inf中读出字符,直到读出nsize-1的字符止,如果在此前遇到换行符
或文件结束.读出的字符存到缓冲区buf中.fgets不会丢弃换行符,换行符
仍被放到缓冲区.fgets成功,返回一个指向buf的指针,否则返回NULL
8.#include
char*string;
FILE*outf;
intretval;
retval=puts(string);
retval=fputs(string,outf);
puts:
把string写到stdout中,但末尾的null字符不包括在内,puts在写入部分
末尾加上一个换行符,但fputs没有这么做
puts,fputs:
出错均返回EOF
9.#include
char*buffer;
intsize,nitems,result;
FILE*inf,outf;
result=fread(buffer,size,nitems,inf)
result=fwrite(buffer,size,nitems,outf)
fread:
对应于从inf的输入流中读出nitems个目标数据,读出的字节放入字符型
数组buffer中,读出的每个目标是长度为size的字节序列.result中的返回
值给出了成功读出的目标个数
fwrite:
把buffer中的数据写到outf指出的流中,该缓冲区被认为由nitems个长度
为size字节的目标组成.result中的返回值给出了成功写入的目标个数
补充:
1.可以通过强制类型转换把结构等类型转换为字符,然后把结构写入文件中,
其它的变量类型也可以用此方法进行读写操作.例如:
structelem{
chard_name[15];
intstart;
intlength;
inttype;
}elist[10]
fwrite((char*)elist,sizeof(structelem),10,stream);
10.#include
FILE*stream;
longoffset,position;
intdirection,result;
result=fseek(stream,offset,direction);
rewind(stream);
position=ftell(stream);
fseek:
同seek类似,fseek成功时,返回0,失败,返回非0
rewind:
把文件读写指针置为文件首,不返回任何值
ftell:
返回流中的当前位置,从文件首开始的字节数(从0开始计数)
11.#include
FILE*oldstream,*newstream;
char*type,*filenam
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UNIX 高级 编程 环境