版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LINUX环境高级编程中国地质大学(武汉)计算机学院朱静中国地质大学(武汉)计算机学院第四讲系统调用线程进程管理文件管理错误处理系统调用概述系统调用概述系统调用概念为了利用文件操作、进程管理和设备管理这些操作系统提供的服务,应用程序必须和操作系统之间交互。这种交互通过“系统调用”来实现。系统调用是程序员和linux内核的函数接口。对程序员来说,系统调用就象库函数(事实上有些就是库函数,由这些库函数再进行真正的系统调用),只是前者直接在linux的核心执行子程序调用。中国地质大学(武汉)计算机学院系统调用类别文件管理进程管理错误管理系统调用概述中国地质大学(武汉)计算机学院文件管理系统调用的层次结构文件特殊文件目录文件openclosereadwritelseekunlinkchowndup2fcntlfstatftruncatestattruncatesyncduplink套接字Internet套接字mknodioctlpipegetdentsacceptbindconnectlistensocketgethostbynamegethostnamehtonlhtonsinet_addrinet_ntoa系统调用概述中国地质大学(武汉)计算机学院进程管理系统调用的层次结构进程信号nicechdirwaitforkexecexitalarmsingnalkillpause系统调用概述中国地质大学(武汉)计算机学院错误处理系统调用的层次结构错误处理perror#include<string.h>char*strerror(interrnum)返回错误原因的描述字符串系统调用概述中国地质大学(武汉)计算机学院错误处理错误处理perror()#include<errno.h>#include<stdio.h>系统调用失败时返回-1,但这个返回值说明不了错误发生的原因,要查询错误原因,必须了解:errno保存上次系统调用错误的数字码的全局变量,初值为0从程序访问errno,预定义的错误码在C程序中通过包含文件“/usr/include/errno.h”来定义。perror程序把errno的当前值转换为文本描述中国地质大学(武汉)计算机学院例:/usr/include/…/errno.h所包含的部分错误常量:#defineEPERM1/*Operationnotpermitted*/#defineENOENT2/*Nosuchfileordirectory*/#defineESRCH3/*Nosuchprocess*/#defineEINTR4/*Interruptedsystemcall*/错误处理中国地质大学(武汉)计算机学院例:perror()应用//showErrno.c#include<stdio.h>#include<fcntl.h>#include<errno.h>main(){intfd;/*打开一个不存在的文件,强制发生一个错误*/fd=open(“nonexist.txt”,O-RDONLY);If(fd==-1))/*anerroroccurred*/{printf(“errno=%%d\n”,errno);perror(“main”);}错误处理中国地质大学(武汉)计算机学院fd=open(“/”,O_WRONLY);//forceadifferenterrorif(fd==-1){printf(“errno=%d\n”,errno);perror(“main”);}/*executeasuccessfulsystemcall*/fd=open(“nonexist.txt”,O_RDONLY|O_CREAT,0644);printf(“errno=%d\n”,errno);//displayaftersuccessfulcallperror(“main”);errno=0;/*manuallyreseterrorvariable*/perror=(“main”);}错误处理中国地质大学(武汉)计算机学院例:perror()应用执行:$./showErrnoerrno=2main:Nosuchfileordirectoryerrno=21main:Isadirectoryerrno=29…evenafterasuccessfulcallmain:Illegalseekmain:Success…afterweresetmanually$_
错误处理中国地质大学(武汉)计算机学院文件管理文件管理基础文件管理系统调用能够操作所有的普通文件、特殊文件和目录文件,包括:基于磁盘的文件终端打印机等设备进程间通信功能,如管道和套接字多数情况下,最初使用open()访问或创建文件,如果系统调用成功,则返回一个称为“文件描述符”的小整数,用于对该文件的I/O操作。如果open()失败,返回-1。中国地质大学(武汉)计算机学院Linux的文件系统实现Linux系统中,实现文件存储和索引的核心是索引节点(inode)结构。每个inode存储了文件的属性、访问权限以及文件数据块的位置。inode是linux系统定位文件的基本途径。VFS(虚拟文件系统):VFS屏蔽了各种具体的文件分区格式,使得用户程序对文件系统的操作不必关心底层的存储介质和文件系统类型的不同。文件管理中国地质大学(武汉)计算机学院文件描述符文件描述符从0开始按顺序编号,前三个描述符具有特定含义:0标准输入(stdin)---键盘1标准输出(stdout)---显示器2标准错误(stderr)单个文件能打开几次,因此它可以有多个文件描述符文件fd1fd2fd3文件管理中国地质大学(武汉)计算机学院文件描述符每个文件描述符有其专有的属性集,与它所关联的文件无关。这些属性包括:记录文件中进行读写操作的偏移量的文件指针;指示如果进程调用exec(),文件描述符是否应自动关闭的标志;指示对文件的所有输出是否应追加到文件末尾的标志;文件管理中国地质大学(武汉)计算机学院文件描述符以下属性只在文件是管道和套接字这样的特殊文件时才有意义:指示如果文件当前不包含任何输入,进程是否应阻塞来自该文件的输入的标志;指示如果文件输入变为可用,应发送一个SIGIO信号的进程ID或进程组的数字;open(),read(),fcntl()等系统调用能操作这些标志。文件管理中国地质大学(武汉)计算机学院文件管理—目录目录操作getcwd—获得当前工作目录#include<unistd.h>char*getcwd(char*buffer,size_tsize)调用成功把当前目录字符串写到缓冲区buffer中,并返回指向当前工作目录字符串的指针,如果目录字符串长度超出了参数size给出的缓冲区长度,目录被删除或者权限发生变化,则调用失败返回NULL。中国地质大学(武汉)计算机学院#include<unistd.h>#include<limits.h>intmain(void){charcur_work_dir[PATH_MAX];inti=0;printf("CurrentMaxPathLengthis:%d\n",PATH_MAX);if(getcwd(cur_work_dir,PATH_MAX)==NULL){perror("Couldn'tgetcurrentworkingdirectory");return1;}printf("CurrentWorkingDirectoryis:");while(cur_work_dir[i]!='\0'){printf("%c",cur_work_dir[i]);i++;}printf("\n");}文件管理—目录中国地质大学(武汉)计算机学院运行结果:CurrentMaxPathLengthis:4096CurrentWorkingDirectoryis:/root文件管理—目录中国地质大学(武汉)计算机学院pathconf—获得系统目录最大长度#include<unistd.h>longpathconf(char*path,intname)调用成功返回目录相关的极限值调用失败返回-1path可以是包含文件名的路径,也可以是目录路径name的取值可以是:_PC_LINK_MAX_PC_NAME_MAX_PC_PATH_MAX……文件管理—目录中国地质大学(武汉)计算机学院例:#include<unistd.h>#include<limits.h>#include<iostream.h>intmain(void){longcur_path_len;char*cur_work_dir;if((cur_path_len=pathconf(".",_PC_PATH_MAX))==-1){perror("couldn'tgetcurrentworkingpathlength");return1;}std::cout<<"currentpathlengthis:"<<cur_path_len<<std::endl;文件管理—目录中国地质大学(武汉)计算机学院if((cur_work_dir=(char*)malloc(cur_path_len))==NULL){perror("couldn'tallocatememoryforthepathname!");return1;}if(getcwd(cur_work_dir,cur_path_len)==NULL){perror("couldn'tgetcurrentworkingdirectory!");return1;}std::cout<<"Currentworkingdirectoryis:"<<cur_work_dir<<std::endl;return0;}运行结果:currentpathlengthis:4096Currentworkingdirectoryis:/root文件管理—目录中国地质大学(武汉)计算机学院chdir,fchdir—切换当前目录#include<unistd.h>intchdir(constchar*path)intfchdir(intfd)调用成功返回0,失败返回-1path指向目录字符串的指针fd目录的文件描述符文件管理—目录中国地质大学(武汉)计算机学院mkdir,rmdir---创建、删除目录#include<sys/stat.h>#include<sys/types.h>intmkdir(constchar*pathname,mode_tmode)pathname:要创建的目录名mode:指定要创建目录的权限#include<unistd.h>intrmdir(constchar*pathname)pathname:要删除的目录名文件管理—目录中国地质大学(武汉)计算机学院opendir---打开目录#include<sys/types.h>#include<dirent.h>DIR*opendir(constchar*pathname);
调用成功打开pathname指定的目录并建立一个目录流,返回指向结构体DIR的指针。调用失败返回NULL。readdir---获得打开目录下的具体内容structdirent*readdir(DIR*dir);调用成功返回指向结构体dirent的指针,返回参数dir目录流的下个目录进入点。后续的readdir将返回后续的目录项。调用失败或读取到目录尾则返回NULL。文件管理—目录中国地质大学(武汉)计算机学院structdirent{ino_td_ino; off_td_off; unsignedshortd_reclen; unsignedchard_type; chard_name[NAME_MAX+1];}d_ino:当前目录的inode节点号;d_off:目录文件首部到下个dirent结构的位移;d_reclen:该记录的长度;d_type:目录文件类型;d_name:目录文件名;例:获取指定目录下的所有文件名和目录名。p4.9.c,printdir.c,printdir2.c文件管理—目录中国地质大学(武汉)计算机学院#include<stdio.h>#include<sys/types.h>#include<dirent.h>intmain(void){DIR*dir;structdirent*drt;inti;dir=opendir("/etc/pcmcia");if(dir==NULL){printf("Cannotopenthedesireddirectory");return1;}while((drt=readdir(dir))!=NULL){printf("filenameordirectory:%s\n",drt->d_name);}closedir(dir);return0;}文件管理—目录中国地质大学(武汉)计算机学院文件管理文件基本操作通过文件描述符对文件进行操作。例:p4.5.c注意:程序运行时,子进程与父进程之间文件描述符的继承方式中国地质大学(武汉)计算机学院典型的文件操作事件序列intfd;//filedescriptor…fd=open(fileName,…);/*openfile,returnfiledescriptor*/If(fd=-1){/*dealwitherrorcondition*/}…fcntl(fd,…);/*setsomeI/Oflagsifnecessary*/…read(fd,…);/*readfromfile*/…文件管理中国地质大学(武汉)计算机学院典型的文件操作事件序列write(fd,…);//writetofile…lseek(fd,…);//seekwithinfile…close(fd);//closethefile,freeingfiledescriptor文件管理中国地质大学(武汉)计算机学院open()----打开文件
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intopen(char*fileName,intmode[,intpermissions])open只能以只读或读写方式打开或创建文件fileName:一个绝对/相对路径的文件名;mode:打开模式;permissions:文件权限的八进制值,只在文件创建时需要;文件管理中国地质大学(武汉)计算机学院open()----打开文件permissions可以是几个标志位按位或后得到。这些标志在sys/stat.h中定义。S_IRUSR文件所有者读权限S_IWUSR文件所有者写权限S_IXUSR文件所有者执行权限S_IRGRP文件所属组读权限S_IWGRP文件所属组写权限S_IXGRP文件所属组执行权限
S_IROTH其他用户读权限S_IWOTH其他用户写权限S_IXOTH其他用户执行权限例:open(“myfile”,O_CREAT,S_IRUSR|S_IXOTH)文件管理中国地质大学(武汉)计算机学院预定义的读/写标志和混合标志的值在”/usr/include/fcntl.h”中定义:O_RDONLY以只读方式打开O_WRONLY以只写方式打开O_RDWR以读写方式打开O_APPEND以追加方式打开(新写入的数据放在文件末尾)O_TRUNC打开文件时将文件长度设置为0,丢弃文件已有的内容O_CREAT创建文件
O_EXCL和O_CREAT一起使用,防止两个程序同时创建一个文件……创建文件sprintf(tmpName,”.rev.%d”,getpid());tmpfd=open(tmpName,O_CREAT|O_RDWR,0600)//open中只有O_CREAT模式下mode才有效,文件实际权限为mode&(~umask)打开已经存在的文件fd=open(fileName,O_RDONLY);文件管理中国地质大学(武汉)计算机学院read()----读文件#include<unistd.h>ssize_tread(intfd,void*buf,size_tcount)read()从文件描述符fd引用的文件读取count个字节到缓冲区buf中。调用成功,read()返回它读取的字节数,否则返回-1;如果在已经读取了最后一个字节后调用read(),它返回0,表示到达了文件末尾。例:
charsRead=read(fd,buffer,BUFFER_SIZE);if(charRead==0)break;//endoffileIf(charRead==-1)fatalError();//error文件管理中国地质大学(武汉)计算机学院write()----写文件#include<unistd.h>ssize_twrite(intfd,void*buf,size_tcount)write()从缓冲区buf向文件描述符fd引用的文件复制count个字节的数据。数据从当前文件位置开始写入。如果打开文件时设置为O_APPEND模式,则每次写入时当前文件位置被置为文件末尾,即以追加方式向文件写入数据。调用成功,write()返回它复制的字节数,否则返回-1;进程应该总是检查返回值,如果返回值不是count,可能磁盘已写满。文件管理中国地质大学(武汉)计算机学院写文件write()例:
/*Copylinetotemporaryfileifreadingfromstdin*/if(standardInput){charsWritten=write(tmpfd,buffer,charsRead);if(charsWritten!=charsRead) fatalError();}文件管理中国地质大学(武汉)计算机学院lseek()----移动文件指针#inlcude<sys/types.h>#include<unistd.h>off_tlseek(intfd,off_toffset,intmode)fd:文件描述符;offset:是一个长整数;mode:描述该如何解释offset。“/usr/include/stdio.h”中定义了mode的三个取值:SEEK_SEToffset相对于文件的开始SEEK_CURoffset相对于当前文件位置SEEK_ENDoffset相对于文件末尾如果试图移动文件指针到文件头之前,lseek()会失败。调用成功,lseek()返回相对文件头的当前字节偏移量,调用失败返回-1文件管理中国地质大学(武汉)计算机学院文件指针移动到文件末尾之外会如何?
off_t
currpos;
currpos=lseek(fd,0,SEEK_CUR);#返回当前文件指针偏移量;
如果fd指向的是pipe、FIFO或者socket,lseek返回-1并且置errno为
ESPIPE。中国地质大学(武汉)计算机学院文件管理移动文件指针lseek()例:/*Findlineandread*/lseek(fd,lineStart[i],SEEK_SET);charsRead=read(fd,buffer,lineStart[i+1]-lineStart[i]);P5.5.C统计指定字符串在指定文件中出现的次数文件管理中国地质大学(武汉)计算机学院close()----关闭文件#include<unistd.h>intclose(intfd)调用成功,close()返回0,否则返回-1。如果fd是打开文件关联的最后一个文件描述符,给该文件分配的内核资源将被收回。当一个进程结束时,它所有的文件描述符都会自动关闭,但提倡当完成文件操作时关闭文件。如果关闭一个已经关闭的文件,会发生错误。当文件关闭时,不保证文件缓冲区立即清空到磁盘。例:close(fd);/*Closeinputfile*/文件管理中国地质大学(武汉)计算机学院删除文件unlink()函数定义:intunlink(constchar*fileName)unlink()删除从文件名finleName指向文件的链接。如果fileName是指向文件的最后一个硬链接,文件的资源被收回。如果调用成功,unlink()返回0,否则返回-1。例:
/*Removetempfile*/if(standardInput)unlink(tmpName);文件管理中国地质大学(武汉)计算机学院文件管理实例—reverse.c例:reverse-c[fileName]reverse将输入文件的各行逆序显示在标准输出上。如果不指定文件名,则逆序显示标准输入的内容。当使用-c选项时,reverse还颠倒每一行中的字符。$gccreverse.c-oreverse$cattestChirstmasiscoming,Thedaysthatgrowshorter.$./reverse–ctest.retrohsworgthatsyadehT,gnimocsisamtsrihC文件管理中国地质大学(武汉)计算机学院reverse的工作过程步骤操作函数系统调用分析命令行parseCommmandLine,openprocessOptions
打开输入文件或读取标准输入,创pass1open
建存储输入的临时文件读取文件,把各行的起始pass1,trackLinesread
偏移量保存在数组中反向读取文件,把每行复制pass2,processLine,lseek
到标准输出,如果选择-c,reverseLine
字符也会逆序输出。关闭文件,如果是临时文件,pass2close
删除临时文件文件管理中国地质大学(武汉)计算机学院其他文件管理系统调用名称功能opendir()打开目录readdir()读目录closedir()关闭目录chown()改变文件所有者和文件组chmod()改变文件权限dup()复制文件描述符dup2同dupfcntl()对各种文件特性的访问stat()获取文件信息文件管理中国地质大学(武汉)计算机学院其他文件管理系统调用名称功能sync调度所有文件缓冲区清空到磁盘mknod创建特殊文件link创建硬链接symlink创建符号链接ioctl控制设备truncate截短文件ftruncate同truncate文件管理中国地质大学(武汉)计算机学院其他文件管理系统调用intchown(constchar*path,uid_towner,gid_tgroup);用户ID和组ID(owner和group)可以通过getuid()和getgid()获得,如果参数owner或group为-1,表示对应的所有者或组不会改变。例1:把文件test.txt的组改为cs,该组的组ID为62/*mychown.c*/main(){intflag;flag=chown("test.txt",-1,62);/*LeaveuserIDunchanged*/if(flag==-1)perror("chown.c");}$ls-ltest.txt-rw-r--r--1glassmusic3May2511:42test.txt$ls-ltest.txt-rw-r--r--1glasscs3May2511:42test.txt文件管理中国地质大学(武汉)计算机学院其他文件管理系统调用intchmod(constchar*path,mode_tmode);
例2:把文件test.txt的权限标志改为600/*mychomod.c*/main(){intflag;flag=chmod("test.txt",0600);/*Useanoctalencoding*/if(flag==-1)perror("chmod.c");}$ls-ltest.txt-rw-r--r--1glassmusic3May2511:42test.txt$ls-ltest.txt-rw-------1glasscs3May2511:42test.txt文件管理中国地质大学(武汉)计算机学院获得文件信息stat()#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>intfstat(intfd,
structstat*statbuf)返回与打开的文件描述符相关的文件的状态信息,该信息写到structstat结构中intstat(constchar*pathname,structstat*statbuf)intlstat(constchar*pathname,structstat*statbuf)stat和lstat是通过文件名查到文件状态信息,它们产生的结果相同。但当文件是一个符号链接时,lstat返回的是该符号链接本身的信息,而stat返回的是该链接所指向的文件的信息。调用成功返回0,失败返回-1文件管理中国地质大学(武汉)计算机学院structstat{ dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; unsignedlong st_blksize; unsignedlong st_blocks; time_t st_atime; time_t st_mtime; time_t st_ctime;}文件管理中国地质大学(武汉)计算机学院st_dev:文件所处的磁盘设备ID号;st_ino:文件的inode索引号;st_mode:文件访问权限和文件类型;st_nlink:文件的硬链接数;st_uid:文件所属的用户ID;st_gid:文件所属的组ID;st_rdev:如果文件是字符或块设备,该值给出该设备的标识符信息;st_size:对常规文件,该值为文件大小;对符号链接,该值为该符号链接所指向的目录长度;对设备文件,该值为0;st_blksize:文件系统存储文件的块大小;st_blocks:分配给文件的块数;st_atime:文件的最近访问时间;st_mtime:文件内容的最近修改时间;st_ctime:文件属性的最近修改时间;文件管理中国地质大学(武汉)计算机学院st_mode:文件访问权限和文件类型;sys/stat.h中提供了POSIX标准的一些宏用于对文件类型、文件访问权限以及用于帮助测试特定类型和权限的掩码的定义。文件访问权限标志同open系统调用。用于判定文件类型的宏:
S_ISLNK(st_mode)判断是否为符号连接
S_ISREG(st_mode)是否为一般文件
S_ISDIR(st_mode)是否为目录
S_ISCHR(st_mode)是否为字符装置文件
S_ISBLK(st_mode
)是否为先进先出
S_ISSOCK(st_mode)是否为socket用于解释st_mode的掩码:S_IFMT:文件类型S_IRWXU:文件所有者的读/写/执行权限;S_IRWXG:文件所属组用户的的读/写/执行权限;S_IRWXO:其他用户的的读/写/执行权限;
文件管理中国地质大学(武汉)计算机学院
例:测试一个文件不是目录,并设置了owneruser的执行权限stat(“filename”,&statbuf);mode=statbuf.st_mode;if(!S_ISDIR(mode)&&(mode&S_IRWXU)==S_IXUSR)文件管理中国地质大学(武汉)计算机学院文件类型标志:
S_IFBLK文件是一个块设备
S_IFDIR文件是一个目录
S_IFCHR文件是一个字符设备
S_IFIFO文件是一个FIFO(命名管道)
S_IFREG文件是一个普通文件
S_IFLNK文件是一个符号链接
例:判断文件类型stat(“filename”,&statbuf);mode=statbuf.st_mode;if((mode&S_IFMT)==S_IFDIR)//目录 printf("Directory\t");elseif((mode&S_IFMT)==S_IFBLK)//块文件 printf("Blockspecialfile\t");elseif((mode&S_IFMT)==S_IFCHR)//特殊字符文件 printf("characterspecialfile\t");elseif((mode&S_IFMT)==S_IFREG)//普通文件 printf("Ordinaryfile\t");elseif((mode&S_IFMT)==S_IFIFO)//管道文件 printf("pipefilefile\t");printf(“Permission:%o\n”,mode&0x1ff);文件管理中国地质大学(武汉)计算机学院文件访问权限的获取:printf("Permission:%o\n",mode&0x1ff);mode是一个无符号整型,一共有16位,前面7位用来表示文件类型,可用掩码按位与确定,后面9位为权限,分别是用户权限,组权限,其他权限,把后9位用0x1ff(111111111)做位运算&就能获得文件权限值。
文件管理中国地质大学(武汉)计算机学院例:stat系统调用的应用。
statapply.c文件管理中国地质大学(武汉)计算机学院chmod,fchmod----修改文件权限#include<sys/types.h>#include<sys/stat.h>intchmod(constchar*path,mode_tmode);path文件或目录所在的路径;调用成功返回0,调用失败返回-1;intfchmod(intfd,mode_tmode);文件管理中国地质大学(武汉)计算机学院chmod,fchmod中使用的宏S_ISUID设置用户权限S_ISGID设置组用户权限S_IRUSR文件所有者的读权限S_IWUSR文件所有者的写权限S_IXUSR文件所有者的执行权限……
文件访问权限标志与open函数使用的相同例:p4.7.c#defineS_IRWXU00700
#defineS_IRUSR00400
#defineS_IWUSR00200
#defineS_IXUSR00100
#defineS_IRWXG00070
#defineS_IRGRP00040
#defineS_IWGRP00020
#defineS_IXGRP00010
#defineS_IRWXO00007
#defineS_IROTH00004
#defineS_IWOTH00002
#defineS_IXOTH00001
文件管理中国地质大学(武汉)计算机学院chown,fchown,lchown---改变文件所有者#include<sys/types.h>#include<unistd.h>intchown(constchar*path,uid_towner,gid_tgroup);path文件或目录的路径;调用成功返回0,调用失败返回-1;只有超级用户才能调用该函数。用户ID号和组ID号(owner和group)可以通过getuid()和getgid()获得。文件管理中国地质大学(武汉)计算机学院umask----修改默认权限当新建一个文件或目录时,linux系统会根据(设定权限-umask值)来决定新建文件或目录的权限;umask表示要关闭哪些权限,root的缺省umask是022,一般用户是002;新建文件默认访问权限是666,目录权限是777。在创建文件或目录时,系统把默认权限的值与umask的值相减,即得到新建文件的访问权限。例如:系统为root用户创建了一个新文件,那么新文件的权限644,而目录则为755。如果用户的umask为000,则创建的文件权限为666,目录权限为777,
运行umask命令可以查看用户自己的umask值。
文件管理中国地质大学(武汉)计算机学院umask----修改默认权限umask函数可以修改umask值;#include<sys/types.h>#include<sys/stat.h>mode_tumask(mode_tmask);例:p4.8.c文件管理中国地质大学(武汉)计算机学院硬链接和软链接(符号链接)1)硬链接:指向inode节点的链接;ln命令可以创建硬链接;$lnlink.testnewlink12)软链接(符号链接):指向文件名的链接;$ln–slink.symbolnewlink23)只有文件才能创建硬链接,目录不能创建硬链接;硬链接不能跨文件系统;4)只有文件所有的硬链接被删除,该文件才能真正被删除;5)符号链接可以跨文件系统;符号链接不影响文件的删除;文件管理中国地质大学(武汉)计算机学院硬链接和软链接(符号链接) $touchf1
#创建一个测试文件f1 $lnf1f2
#创建f1的一个硬链接文件f2 $ln-sf1f3
#创建f1的一个符号链接文件f3 $ls-li
#-i参数显示文件的inode节点信息
total0
9797648-rw-r--r--
2
oracle
oinstall0Apr2108:11f1
9797648-rw-r--r--
2oracleoinstall0Apr2108:11f2
9797649lrwxrwxrwx
1oracleoinstall2Apr2108:11f3->f1
从上面的结果中可以看出,硬链接文件f2与原文件f1的inode节点相同,均为9797648,然而符号链接文件的inode节点不同。中国地质大学(武汉)计算机学院文件管理link---创建硬链接#include<unistd.h>intlink(constchar*oldpath,constchar*newpath);调用成功返回0,调用失败返回-1;symlink---创建符号链接#include<unistd.h>intsymlink(constchar*oldpath,constchar*newpath);unlink---删除链接#include<unistd.h>intunlink(constchar*path);文件管理中国地质大学(武汉)计算机学院综合实例:定制自己的ls命令。
p4.10.c打开目录获得该目录下的所有文件列表将文件列表存入一个链表中遍历链表,对每个文件调用stat输出每个文件信息打开目录信息输出文件管理中国地质大学(武汉)计算机学院其他文件管理系统调用#include<unistd.h>intdup(intfd);intdup2(intoldfd,intnewfd);dup()和dup2()函数用于复制打开的文件描述符。dup()返回当前进程最小的未使用的文件描述符。dup2()函数中指定的newfd如果已经使用,将先被关闭,再进行复制。
文件管理中国地质大学(武汉)计算机学院其他文件管理系统调用例3:创建一个文件test.txt,然后通过4个不同的文件描述符写这个文件。/*mydup.c*/#include<stdio.h>#include<fcntl.h>main(){intfd1,fd2,fd3;
fd1=open("test.txt",O_RDWR|O_TRUNC);printf("fd1=%d\n",fd1);write(fd1,"what's",6);
fd2=
dup(fd1);/*Makeacopyoffd1*/printf("fd2=%d\n",fd2);write(fd2,"up",3);
close(0);/*Closestandardinput*/
文件管理中国地质大学(武汉)计算机学院其他文件管理系统调用例3:续fd3=dup(fd1);/*Makeanothercopyoffd1*/printf("fd3=%d\n",fd3);
write(0,"doc",4);
dup2(3,2);/*Duplicatechannel3tochannel2*/
write(2,"?\n",2);}思考:程序运行的结果?文件管理中国地质大学(武汉)计算机学院标准I/O库(stdio.h)
标准I/O库提供复杂函数用于格式化I/O和满足设备的缓冲需求,用于为底层I/O系统调用提供一个通用接口。
标准I/O库中,与底层文件描述符对应的是流(stream),它被实现为指向结构FILE的指针。
每个文件流都跟一个底层文件描述符关联。
进程创建时,有3个文件流自动打开:stdin、stdout、stderr。它们与底层文件描述符0,1,2对应,在stdio.h中被定义。文件管理中国地质大学(武汉)计算机学院标准I/O库函数fopen、fclosefread、fwritefgetc、getc、getcharfputc、putc、putcharfgets、getsprintf、fprintf、sprintfscanf、fscanf、sscanf文件管理中国地质大学(武汉)计算机学院标准I/O库函数与系统调用运行效率的对比
copy_system.c系统调用,每次读一个字符(LPP87) copy_block.c系统调用,每次读一个block(LPP88) copy_stdio.c库函数调用,FILE内部缓冲区满时才进行底层系统调用(LPP98)$TIMEFORMAT=……$time./copy_***对比运行时间文件管理中国地质大学(武汉)计算机学院/proc文件系统 /proc是一个特殊的目录,它映射到linux提供的一个特殊的文件系统procfs,用来实现对底层的设备驱动程序和内核信息进行更高层次的访问。文件管理中国地质大学(武汉)计算机学院/proc文件系统的内容
/proc下以数字命名的子目录用于提供进程的信息; /proc/modules所有加载到内核的模块列表 /proc/mounts系统中使用的所有挂载 /proc/partitions分区中的块分配信息 /proc/stat所有的CPU活动信息 /proc/versionLinux内核版本和gcc版本 /proc/fs文件系统信息 /proc/cpuinfocpu的详细信息 /proc/net网卡设备信息 /proc/ttytty设备信息直接读取这些文件内容就能获得状态信息(例如cat显示)超级用户可以通过写/proc下的文件来修改系统参数文件管理中国地质大学(武汉)计算机学院fcntl系统调用对打开的文件描述符执行各种操作,包括对它们的复制、获取和设置文件描述符标志、获取和设置文件状态标志,以及管理建议性文件锁等。#include<fcntl.h>intfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);对不同操作的选择是通过选取命令参数cmd不同的值来实现的,其取值定义在fcntl.h中。根据所选择的命令的不同,决定是否需要第三个参数。文件管理中国地质大学(武汉)计算机学院fcntl系统调用fcntl系统调用有5种功能:
1.复制一个现有的描述符(cmd=F_DUPFD).
2.获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
3.获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).
4.获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).
5.获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW).文件管理中国地质大学(武汉)计算机学院fcntl系统调用fcntl()的返回值与命令有关。如果出错,所有命令都返回-1,如果成功则返回某个其他值。下列命令有特定返回值:
F_DUPFD
返回新的文件描述符
F_GETFD
返回相应标志
F_GETFL,F_GETOWN
返回一个正的进程ID或负的进程组ID文件管理中国地质大学(武汉)计算机学院cmd=F_DUPFD
返回一个如下描述的(文件)描述符:
·最小的大于或等于arg的一个可用的描述符
·与原始操作符一样的某对象的引用
·如果对象是文件(file)的话,则返回一个新的描述符,这个描述符与arg共享相同的偏移量(offset)
·相同的访问模式(读,写或读/写)
·相同的文件状态标志 ·新文件描述符的close-on-exec标志被设置为交叉式访问
dup(oldfd);
等效于
fcntl(oldfd,F_DUPFD,0);文件管理中国地质大学(武汉)计算机学院cmd=F_GETFD和F_SETFD
F_GETFD
获得与文件描述符fd关联的close-on-exec标志,类似FD_CLOEXEC。如果返回值和FD_CLOEXEC进行与运算结果是0的话,文件保持交叉式访问exec(),否则如果通过exec运行的话,文件将被关闭(arg被忽略)
F_SETFD
设置close-on-exec标志,该标志以参数arg的FD_CLOEXEC位决定,通常不使用常数FD_CLOEXEC,而是将此标志设置为0(系统默认值,exec时不关闭)或1(exec时关闭)
文件管理中国地质大学(武汉)计算机学院cmd=F_GETFL和F_SETFLF_GETFL
取得fd的文件状态标志,(O_RDONLY,O_WRONLY,O_RDWR)需要用屏蔽字O_ACCMODE相与取得存取方式位,然后将结果与三个常量比较进行判定。F_SETFL
设置描述符状态标志
O_NONBLOCK
非阻塞I/O
O_APPEND
强制每次写(write)操作都添加在文件的末尾
O_DIRECT
最小化或去掉reading和writing的缓存影响
O_ASYNC
当I/O可用的时候,允许SIGIO信号发送到进程组,例如:当有数据可以读的时候例:获取文件描述符属性。getfdinfo.c文件管理中国地质大学(武汉)计算机学院设备文件概述linux系统中,所有的设备都以特殊文件的形式存在。在/dev目录下保存了指向系统中硬件的特殊文件。程序可以像访问普通文件一样来访问硬件,无需使用特殊的接口函数。设备类型:字符设备以字节流访问的设备块设备以块为单位进行读写操作的设备网络接口主设备号和从设备号:内核通过主从设备号将设备文件与真实的设备关联起来。由同一个设备驱动控制的所有设备具有相同的主设备号;从设备号用以区分相同的设备驱动控制的不同子设备。文件管理—设备管理中国地质大学(武汉)计算机学院重要的设备文件/dev/console系统控制台。错误信息和诊断信息被发送到这里。/dev/tty控制终端的别名(逻辑设备)。/dev/null空设备。所有写往这个设备的输出都被丢弃,读这个设备会立即返回一个EOF标志。文件管理—设备管理中国地质大学(武汉)计算机学院linux设备驱动工作流程Linux系统启动时,设备驱动将被加载;设备驱动加载成功后,向系统反馈一个主设备号,驱动程序将根据该主设备号在/dev目录下创建对应的设备文件。之后,用户程序就可以利用open(),read(),write()等函数或命令,通过设备文件实现对设备的访问。文件管理—设备管理中国地质大学(武汉)计算机学院Linux终端设备用户与主机交互的设备称为终端设备。Linux系统中所有终端设备被称为tty。是字符设备。Linux中的终端设备文件类型:串行端口终端(/dev/ttySn):分别对应于COM1,COM2,……,COMn口;伪终端(/dev/pts/n):使用telet登录到linux系统控制终端(dev/tty):当前进程的控制终端控制台终端(dev/tty,/dev/console):linux将显示器称为控制台终端,用于接收和输出控制台信息。默认有tty1~tty6,tty7~tty8。文件管理—设备管理中国地质大学(武汉)计算机学院与终端的交互#include<unistd.h>intisatty(intfd);
若fd为终端设备则返回1,否则返回0intfileno(FILE*stream);
返回和stream文件流对应的文件描述符。如果失败,返回-1例:menu1.c(LPP144)menu2.c程序中与用户交互的部分不允许重定向,其他部分允许重定向。(LPP148)menu3.c将程序中与用户交互的部分与stdin,stdout分开,直接读写终端。(LPP149)文件管理—设备管理中国地质大学(武汉)计算机学院ttyname()----获得当前终端名称#include<unistd.h>char*ttyname(intfd)调用成功返回打开的文件描述符fd对应的终端名称;调用失败返回NULL;例:p6.1.c文件管理—设备管理中国地质大学(武汉)计算机学院tcgetattr()----获得终端相关参数tcsetattr()----设置终端相关参数#include<unistd.h>#include<termios.h>inttcgetattr(intfd,structtermios*termios_p);inttcsetattr(intfd,intoptional_actions,consttermios*termios_p);调用成功返回0;调用失败返回-1;optional_actions用来指定什么时候新的终端属性起作用;TCSANOW立即作用TCSADRAIN发送了所有输出后才作用TCSAFLUSH发送了所有输出后作用,且更改发生时未读取的所有输入数据都被清除(FLUSH)文件管理—设备管理中国地质大学(武汉)计算机学院structtermios{
tcflag_tc_iflag;
tcflag_tc_oflag;
tcflag_tc_cflag;
tcflag_tc_lflag;
cc_t
c_cc[NCCS];
}; c_iflag输入模式
c_oflag输出模式
c_cflag控制模式
c_lflag本地模式:可以设置(非/标准模式)/密码不显示~ECHO
c_cc特殊的控制字符
通过termios结构可以对终端接口进行控制
输入模式,输出模式,控制模式,本地模式,特殊控制字符
文件管理—设备管理中国地质大学(武汉)计算机学院c_oflag
OPOST
启用具体实现自行定义的输出。OLCUC
(不属于POSIX)将输出中的小写字母映射为大写字母。ONLCR(XSI)将输出中的新行符映射为回车-换行OCRNL
将输出中的回车映射为新行符。ONOCR不在第0列输出回车。ONLRET不输出回车。OFILL
发送填充字符作为延时。OFDEL
(不属于POSIX)填充字符是ASCIIDEL(0177)。如果不设置填充字符则是ASCIINUL。NLDLY
新行延时掩码。取值为NL0和NL1。CRDLY回车延时掩码。取值为CR0,CR1,CR2或CR3。TABDLY水平跳格延时掩码。取值为TAB0,TAB1,TAB2,TAB3(或XTABS)。取值为TAB3,即XTABS,将扩展跳格为空格(每个跳格符填充8个空格)。BSDLY回车延时掩码。取值为BS0或BS1.(从来没有被实现)VTDLY
竖直跳格掩码。取值为VT0或VT1。FFDLY
进表延时掩码。取值为FF0或者FF1。文件管理—设备管理中国地质大学(武汉)计算机学院c_iflag
GNBRK
忽略输入中的BREAK状态BRKINT
如果设置了IGNBRK,将忽略BREAK。如果没有设置,但是设置了BRKINT,那么BREAK将使得输入和输出队列被刷新,如果终端是一个前台进程组的控制终端,这个进程组中所有进程将收到SIGINT信号。如果既未设置IGNBRK也未设置BRKINT,BREAK将视为NUL同义字符,除非设置了PARMRK,这种情况下被视为序列\377\0\0IGNPAR
忽略帧错误和奇偶校验错误PARMRK如果没有设置IGNPAR,在有奇偶校验错误或者桢错误的字符前插入\377\0。如果既没有设置IGNPAR也没有设置PARMRK,将所有奇偶校验错误或者帧错误的字符视为\0。INPCK启用输入奇偶校验检测。ISTRIP
去掉第八位。INLCR
将输入的NL翻译为CR。IGNCR
忽略输入中的回车。ICRNL
将输入中的回车翻译为新行字符(除非设置了IGNCR)。文件管理—设备管理中国地质大学(武汉)计算机学院c_cflag
CBAUD
(不属于POSIX)波特率掩码(4+1位)。CBAUDEX(不属于POSIX)扩展的波特率掩码(1位),包含在CBAUD中。CSIZE
字符长度掩码。取值为CS5,CS6,CS7或CS8。CSTOPB
设置两个停止位。(默认为1个)
CREAD启用接收,可以接收字符。
PARENB启用奇偶校验。PARODD输入和输出是奇校验HUPCL
在最后一个进程关闭设备后,降低MODEM控制线(挂断)。CLOCAL
忽略MODEM控制线。LOBLK(不属于POSIX)从非当前SHELL层阻塞输出(用于sh1)。CIBAUD(不属于POSIX)输入速度的掩码。CIBAUD各位的值与CBAUD各位相同,左移了IBSHIFT位。CRTSCTS
(不属于POSIX)启用RTS/CTS(硬件)控制流。文件管理—设备管理中国地质大学(武汉)计算机学院c_lflag
ICANON用于实现规范输入,即read()读到行结束符后返回,常用于终端的处理;若串口用于发送/接收数据,则应清除此标志,使用非规范模式(raw
mode)。非规范模式中,输入数据不组成行,不处规范模式中的特殊字符。ISIG当接收到字符INTR,QUIT,SUSP或DSUSP时,产生相应的信号。ECHO
回显输入字符。ECHOE
如果同时设置了ICANON,字符ERASE擦除前一个输入字符,WERASE擦除前一个词。ECHOK如果同时设置了ICANON,字符KILL删除当前行。ECHONL
如果同时设置了ICANON,回显字符NL,即使没有设置ECHO。NOFLSH禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列。TOSTOP
向试图写控制终端的后台进程组发送SIGTTOU信号。PENDIN(不属于POSIX;LINUX不支持)在读入一个字符时,输入队列中的所有字符被重新输出。(bash用他来处理typeahead)。IEXTEN启用实现自定义的输入处理。这个标志必须与ICANON同时使用,才能解释特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC标志才有效。文件管理—设备管理中国地质大学(武汉)计算机学院c_cc数组
在非规范模式中,c_cc[VMIN]和c_cc[VTIME]用于设置read()返回前读到的最少字节数和读超时时间,其值分为四种情况:
c_cc[VMIN]>0,c_cc[VTIME]>0
读到一个字节后,启动定时器,其超时时间为c_cc[VTIME],read()返回的条件为至少读到c_cc[VMIN]个字符或定时器超期。c_cc[VMIN]>0,
c_cc[VTIME]
==0
只要读到数据的字节数大于等于c_cc[VMIN],则read()返回;否则,将无限期阻塞等待。c_cc[VMIN]
==
0,
c_cc[VTIME]>0
只要读到数据,则read()返回;若定时器超期(定时时间c_cc[VTIME])却未读到数据,则read()返回0;c_cc[VMIN]
==
0,
c_cc[VTIME]
==
0
若有数据,则read()读取指定数量的数据后返回;若没有数据,则read()返回0;
文件管理—设备管理中国地质大学(武汉)计算机学院例:密码输入关闭回显
#i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婚庆行业前台工作总结
- 定制家具设计师工作要点
- 《美丽的海洋世界》课件
- 购物服务员工作总结
- 前台文员情绪智力提升方案计划
- 《苗木霜害怎么预防》课件
- 2024年广东省汕尾市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2021年甘肃省嘉峪关市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2023年四川省雅安市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2021年云南省楚雄自治州公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 国家电网招聘之财务会计类题库含完整答案(必刷)
- 建筑物拆除的拆除工厂考核试卷
- 广东省深圳市2023-2024学年高二上学期期末测试英语试卷(含答案)
- 2024年手术室带教工作计划样本(5篇)
- 乘风化麟 蛇我其谁 2025XX集团年终总结暨颁奖盛典
- 人教版一年级数学2024版上册期末测评(提优卷一)(含答案)
- 医疗护理员理论知识考核试题题库及答案
- 湖北省荆州市八县市区2023-2024学年高二上学期1月期末联考数学试题 附答案
- 保密知识培训
- 2024年同等学力申硕英语考试真题
- 2024年人教版八年级历史下册期末考试卷(附答案)
评论
0/150
提交评论