四川大学 linux 第6章 Linux系统调用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章Linux系统调用6.1Linux系统调用概述•系统调用是Linux操作系统内核提供给用户程序的接口;•应用程序通过该接口使用系统资源;•如果没有系统调用,应用程序失去内核的支持,也无法利用内核提供的系统资源。系统调用主要分为如下几类:•文件系统控制类;•文件系统操作类;•进程控制类;•操作系统控制类;•内存管理类;•网络管理类;•Socket控制类;•用户管理类;•进程间通信类。6.1Linux系统调用概述系统调用是一种函数调用,与一般的函数调用相比,在表现方式上和实现效果上有明显不同:•表现方式上的不同:一般函数调用时直接由调用过程转向被调用过程;而系统调用不允许由调用过程直接转向被调用过程,要借助于信号(软中断),先进入系统内核,再转向相应的系统调用。•实现效果上的不同:一般函数调用一直在用户空间上进行,不能进入操作系统内核空间;而系统调用需要从用户空间切换到内核空间,并在内核空间下进行。由于内核空间处于保护模式下,更加安全。因此,通过系统调用方式提供给应用程序使用内核资源不但更加安全,而且优先级高,响应速度快,效率高。6.1Linux系统调用概述6.1Linux系统调用概述用户应用程序链接库函数用户态系统调用核心态文件子系统进程控制子系统硬设备控制系统硬件硬件图6.1linux调用•在C语言中存在一系列链接库,在链接库中含有一系列函数调用,如链接库stdio.h中含有标准输入、输出操作的fopen、fclose,fread、fwrite、fseek、ftell等,用户应用程序调用这些链接库函数。这些函数位于操作系统之上,需要通过系统调用才能和操作系统内核取得联系。6.1Linux系统调用概述6.2文件系统类系统调用fcntl:文件控制;flock:文件加/解锁;create:创建新文件;open:打开文件;close:关闭文件;read:读文件;write:写文件;ready:从文件读入数据到缓冲数组中;writey:将缓冲数组里的数据写入文件;pread:对文件随机读;pwrite:对文件随机写;lseek:移动文件指针;_llseek:在64位地址空间里移动文件指针;dup:复制已打开的文件描述符;dup2:按指定条件复制文件描述符。1.文件控制fcntl文件控制系统调用fcntl针对文件描述符进行控制。该系统调用格式为:intfcntl(intfd,intcmd,arg);其中:fd是文件描述符;cmd是控制类型;arg为返回值。如果该系统调用成功,则返回整数cmd;如果该系统调用失败,则返回-1,表示出错。arg参数总是一个整数,通常在文件fcntl.h中定义。在作为记录锁用时,指向一个结构的指针。6.2文件系统类系统调用fcntl函数有5种功能:(1)当cmd=F_DUPFD时,其功能为复制一个现有的文件描述符。fcntl返回值为新的文件描述符,该描述符的值为:最小的大于或等于arg的一个可用的描述符;与原始操作符一样的某对象的引用;如果对象是文件(file)的话,则返回一个新的描述符,这个描述符与arg共享相同的偏移量(offset);相同的访问模式(读,写或读/写);相同的文件状态标志(如:两个文件描述符共享相同的状态标志);与新的文件描述符结合在一起的close-on-exec标志被设置成交叉式访问execve(2)的系统调用。6.2文件系统类系统调用(2)当cmd=F_GETFD或F_SETFD时,其功能为获得/设置文件描述符标志,fcntl返回值为响应标志。cmd=F_GETFD时:取得与文件描述符fd联合close-on-exec标志,类似FD_CLOEXEC。如果返回值和FD_CLOEXEC进行与运算结果是0的话,文件保持交叉式访问exec(),否则如果通过exec运行的话,文件将被关闭(arg被忽略)。cmd=F_SETFD时:设置close-on-exec旗标。该旗标以参数arg的FD_CLOEXEC位决定。6.2文件系统类系统调用(3)当cmd=F_GETFL或F_SETFL时,其功能为获得/设置文件状态标志,fcntl返回值为一个正的进程ID或负的进程组ID。。cmd=F_GETFL时:取得fd的文件状态标志,如同下面的描述一样(arg被忽略)。cmd=F_SETFL时:设置给arg描述符状态标志,可以更改的几个标志是:O_APPEND,O_NONBLOCK,O_SYNC和O_ASYNC。在修改文件描述符标志或文件状态标志时必须谨慎,先要取得现在的标志值,然后按照希望修改它,最后设置新标志值。不能只是执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位。6.2文件系统类系统调用(4)当cmd=F_GETOWN或F_SETOWN时,其功能为获得/设置异步I/O所有权。cmd=F_GETOWN时:取得当前正在接收SIGIO或者SIGURG信号的进程id或进程组id,进程组id返回成负值(arg被忽略)。cmd=F_SETOWN时:设置将接收SIGIO和SIGURG信号的进程id或进程组id,进程组id通过提供负值的arg来说明,否则,arg将被认为是进程的标识符(pid)。6.2文件系统类系统调用(5)当cmd=F_GETLK,F_SETLK或F_SETLKW时,其功能为获得/设置记录锁。锁操作包括:测试属于其他进程的锁并立即返回,指明是否发现其他锁。设置一个锁并进入睡眠直到成功。设置一个锁,如果不成功,立即返回。内核关闭文件(用系统调用close)时,自动释放由某个进程设置的锁。cmd=F_GETFL和F_SETFL的标志分别为O_NONBLOCK、O_APPEN、O_DIRECT和O_ASYNC。6.2文件系统类系统调用O_NONBLOCK为非阻塞I/O;如果read(2)调用没有可读取的数据,或者如果write(2)操作将阻塞,read或write调用返回-1和EAGAIN错误;O_APPEN为强制每次写(write)操作都添加在文件大的末尾,相当于open(2)的O_APPEND标志;O_DIRECT为最小化或去掉reading和writing的缓存影响。系统将企图避免缓存读或写的数据。如果不能够避免缓存,那么它将最小化已经被缓存了的数据造成的影响。如果这个标志用的不够好,将大大的降低性能;O_ASYNC为当I/O可用的时候,允许SIGIO信号发送到进程组。例如:当有数据可以读的时候。6.2文件系统类系统调用cmd=F_GETL为通过第三个参数arg(一个指向flock的结构体)取得第一个阻塞lockdescription指向的的锁。取得的信息将覆盖传到fcntl()的flock结构的信息。如果没有发现能够阻止本次锁(flock)生成的锁,这个结构将不被改变,除非锁的类型被设置成F_UNLCK。cmd=F_SETLK为按照指向结构体flock的指针的第三个参数arg所描述的锁的信息设置或者清除一个文件segment锁。F_SETLK被用来实现共享(或读)锁(F_RDLCK)或独占(写)锁(F_WRLCK),同样可以去掉这两种锁(F_UNLCK)。如果共享锁或独占锁不能被设置,fcntl()将立即返回EAGAIN。cmd=F_SETLKW为除了共享锁或独占锁被其他的锁阻塞这种情况外,该命令和F_SETLK是一样的。如果共享锁或独占锁被其他的锁阻塞,进程将等待直到这个请求能够完成。当fcntl()正在等待文件的某个区域的时候捕捉到一个信号,如果这个信号没有被指定SA_RESTART,fcntl将被中断。6.2文件系统类系统调用结构体flock的定义:structflock{short1_type;/*锁操作类型:F_RDLCK加读锁;F_WRLCK加写锁;F_UNLCK解锁*/short1_whence;/*锁偏移量SEEK_SET从文件头开始(0);锁偏移量SEEK_CUR从当前文件指针开始(1);*//*锁偏移量SEEK_END从文件尾开始(2)。*/long1_start;/*按照1_whence进行解释的字节偏移量*/long1_len;/*欲上锁的字节数,若为0,从1_start到文件尾上锁*/short1_pid;/*对文件上锁的进程ID*/}F_GETFD的返回值为响应标志,F_GETFL以及F_GETOWN的返回值为一个正的进程ID或负的进程组ID。6.2文件系统类系统调用例在fcntl设置文件状态标志。#includeunistd.h#includefcntl.h#includeerrno.h#includestring.h#includestdlib.h#defineMSG_TRYtryagain\nintmain(void){charbuf[10];intn;intflags;flags=fcntl(STDIN_FILENO,F_GETFL);flags|=O_NONBLOCK;if(fcntl(STDIN_FILENO,F_SETFL,flags)==-1){perror(fcntl);exit(1);}tryagain:n=read(STDIN_FILENO,buf,10);if(n0){if(errno==EAGAIN){sleep(1);write(STDOUT_FILENO,MSG_TRY,strlen(MSG_TRY));gototryagain;}perror(readstdin);exit(1);}write(STDOUT_FILENO,buf,n);return0;}6.2文件系统类系统调用2.文件加/解锁flock系统调用flock用于文件的加锁和解锁。系统调用flock源自于UNIX的BSD版本,在传统的类UNIX操作系统中,系统调用flock()只适用于劝告锁。但是,Linux2.6内核利用系统调用flock实现了共享模式下的强制锁。因此,与fcntl不同,flock只能用于对整个文件进行加锁,而不能用于对记录的加锁。6.2文件系统类系统调用系统调用flock的格式为:intflock(intfd,intoperation);其中:fd表示文件描述符;operation表示指定要进行的锁操作,其取值和表示的意义如下:LOCK_SH:表示要创建一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有;LOCK_EX:表示创建一个排他锁,在任意时间内,一个文件的排他锁只能被一个进程拥有;LOCK_UN:表示删除该进程创建的锁;LOCK_MAND:主要是用于共享模式强制锁,可以与LOCK_READ或者LOCK_WRITE联合起来使用,从而表示是否允许并发的读操作或者并发的写操作。6.2文件系统类系统调用通常情况下,如果加锁请求不能被立即满足,那么系统调用flock()会阻塞当前进程。比如,进程想要请求一个排他锁,但此时,已经由其他进程获取了这个锁,那么该进程将会被阻塞。如果想要在没有获得这个排他锁的情况下不阻塞该进程,可以将LOCK_NB和LOCK_SH或者LOCK_EX联合使用,那么系统就不会阻塞该进程。flock()所加的锁会对整个文件起作用。6.2文件系统类系统调用3.创建新文件create系统调用creat创建一个新文件或重写一个旧文件,并将文件描述符fd返回给用户程序。用户利用文件描述符对文件进行读写。系统调用格式为:intcreat(path,smode);char*path;intsmode;该系统调用的返回值为文件描述符。6.2文件系统类系统调用其中:path为创建的文件名(包含全路径);smode为文件实际的权限。在文件修改模式命令chmod中,用户对文件读、写、执行的访问权mode用3位8进制数mnk表示(详见文件系统一章中的chmod部分),例如mode=751说明文件的所有者有读、写、执行权,同组用户有读、执行权,其他用户只有执行权限。如果用户先用umaskxyz命令对文件的权限作了限制,则实际建立的权限smode就是xyz与mnk作“与”运算的结果,例如xyz

1 / 189
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功