第五讲系统调用new.ppt
《第五讲系统调用new.ppt》由会员分享,可在线阅读,更多相关《第五讲系统调用new.ppt(120页珍藏版)》请在三一文库上搜索。
1、第五讲 系统调用,系统调用简介 文件管理 进程管理 信号 进程间通信,1,5.1系统调用简介,系统调用概念 为了利用创建文件、进程创建和复制及进程间通信这些操作系统提供的服务,应用程序必须和操作系统之间交互。这种交互通过“系统调用”来实现。 系统调用是程序员和linux内核的函数接口。 对程序员来说,系统调用就象库函数(事实上有些就是库函数,由这些库函数再进行真正的系统调用),只是前者直接在linux的核心执行子程序调用。,2,系统调用类别,文件管理 进程管理 错误管理,3,文件管理系统调用的层次结构,文件,特殊文件,目录文件,open,close,read,write,lseek,unlin
2、k,chown dup2 fcntl fstat ftruncate stat truncate sync dup link,套接字,Internet套接字,mknod ioctl pipe,getdents,accept bind connect listen socket,gethostbyname gethostname htonl htons inet_addr inet_ntoa,4,进程管理系统调用的层次结构,进程,信号,nice chdir wait fork exec exit,alarm singnal kill pause,5,错误处理系统调用的层次结构,错误处理,perr
3、or,6,5.2 文件管理,文件管理系统调用能够操作所有的普通文件、特殊文件和目录文件,包括: 基于磁盘的文件 终端 打印机等设备 进程间通信功能,如管道和套接字 多数情况下,最初使用open()访问或创建文件,如果系统调用成功,则返回一个称为“文件描述符”的小整数,用于对该文件的I/O操作。如果open()失败,返回-1。,7,int fd; /file descriptor fd=open(fileName,); /*open file, return file descriptor*/ If(fd=-1) /*deal with error condition */ fcntl (fd,
4、); /*set some I/O flags if necessary */ ,典型的文件操作事件序列,8,read(fd,); /* read from file */ write(fd,); /write to file lseek(fd,); /seek within file close(fd); /close the file,freeing file descriptor,典型的文件操作事件序列,9,文件描述符从0开始按顺序编号,前三个描述符具有特定含义: 0 标准输入(stdin)- - -键盘 1 标准输出(stdout)- - -显示器 2 标准错误(stderr) 单个文
5、件能打开几次,因此它可以有多个文件描述符,文件,fd1,fd2,fd3,5.2.1文件描述符,10,每个文件描述符有其专有的属性集,与它所关联的文件无关。这些属性包括: 记录文件中进行读写操作的偏移量的文件指针; 指示如果进程调用exec(),文件描述符是否应自动关闭的标志; 指示对文件的所有输出是否应追加到文件末尾的标志;,5.2.1文件描述符,11,以下属性只在文件是管道和套接字这样的特殊文件时才有意义: 指示如果文件当前不包含任何输入,进程是否应阻塞来自该文件的输入的标志; 指示如果文件输入变为可用,应发送一个SIGIO信号的进程ID或进程组的数字; 系统调用open()和fcntl()
6、能操作这些标志。,5.2.1文件描述符,12,打开文件open() 读文件read() 写文件write() 移动文件指针lseek() 关闭文件close() 删除文件unlink(),5.2.2 文件管理系统调用,13,函数定义 int open (char *fileName, int mode ,int permissions) open只能以只读或读写方式打开或创建文件,fileName是一个绝对/相对路径的文件名,mode打开模式,permissions是代表文件权限标志的一个编码值,该值只在创建文件时提供。 预定义的读/写标志和混合标志的值在”/usr/include/fcntl
7、.h”中定义: O_RDONLY以只读方式打开; O_WRONLY以只写方式打开; O_RDWR以读写方式打开,5.2.2.1 打开文件open(),14,创建文件 /.开始的文件名使其成为隐藏文件 sprintf ( tmpName,”. rev.%d”, getpid(); /创建临时文件,可读写,设置文件权限 tmpfd=open (tmpName, O_CREAT | O_RDWR,0600) if(tmpfd=-1) fatalError(); 打开已经存在的文件 fd=open (fileName, O_RDONLY); if (fd=-1) fatalError();,5.2.2
8、.1打开文件open(),15,函数定义 ssize_t read(int fd, void* buf, size_t count) read()从文件描述符fd引用的文件读取count个字节到缓冲区buf。 调用成功,read()返回它读取的字节数,否则返回-1;如果在已经读取了最后一个字节后调用read(),它返回0,表示到达了文件末尾。 例:charsRead=read (fd, buffer, BUFFER_SIZE); if(charRead=0) break; / end of file If(charRead=-1) fatalError(); /error,5.2.2.2读文件
9、read(),16,函数定义 ssize_t write(int fd, void* buf, size_t count) write()从缓冲区buf向文件描述符fd引用的文件复制count个字节。 字节从当前文件位置开始写入,然后更新当前文件位置。如果设置fd的O_APPEND标志,则每次写操作前文件位置被置为文件末尾。 调用成功,write()返回它复制的字节数,否则返回-1;进程应该总是检查返回值,如果返回值不是count,可能磁盘已写满。,5.2.2.3写文件write(),17,例: /* Copy line to temporary file if reading from st
10、din */ if (standardInput) charsWritten = write (tmpfd, buffer, charsRead); if(charsWritten != charsRead) fatalError (); ,5.2.2.3写文件write(),18,函数定义 off_t lseek(int fd, off_t offset, int mode) fd是文件描述符,offset是一个长整数,mode描述该如何解释offset。 “/usr/include/stdio.h”中定义了mode的三个取值: SEEK_SET offset相对于文件的开始 SEEK_CU
11、R offset相对于当前文件位置 SEEK_END offset相对于文件末尾,5.2.2.4移动文件指针lseek(),19,如果试图移动文件指针到文件头之前,lseek()会失败。 如果成功,lseek()返回当前文件指针位置,否则返回-1 例: /* Find line and read */ lseek (fd, lineStarti, SEEK_SET); charsRead = read (fd, buffer, lineStarti+1 - lineStarti);,5.2.2.4 移动文件指针lseek(),20,函数定义 int close(int fd) 如果fd是和特定
12、打开文件关联的最后一个文件描述符,给该文件分配的内核资源将被收回。 当一个进程结束时,它所有的文件描述符都会自动关闭,但最好当完成文件操作时关闭文件。 如果关闭一个已经关闭的文件,会发生错误。 调用成功,close()返回0,否则返回-1。 例: close (fd); /* Close input file */,5.2.2.5 关闭文件close(),21,函数定义 int unlink(const char* fileName) unlink()删除从文件名fileName指向文件的硬链接。如果fileName是指向文件的最后一个链接,文件的资源被收回。 如果调用成功,unlink()返
13、回0,否则返回-1。 例: /* Remove temp file */ if (standardInput) unlink (tmpName);,5.2.2.6 删除文件unlink(),22,例:reverse -c fileName reverse将输入文件的各行逆序显示在标准输出上。如果不指定文件名,则逆序显示标准输入的内容。 当使用-c选项时,reverse还颠倒每一行中的字符。 $gcc reverse.c -o reverse $cat test Chirstmas is coming, The days that grow shorter. $./reverse c test
14、.retrohs worg that syad ehT ,gnimoc si samtsrihC,5.2.3文件管理实例,23,例:reverse -c fileName $cat test | ./reverse The days grow shorter. Christmas is coming.,5.2.3文件管理实例,24,reverse的工作过程 步骤 操作 函数 系统调用 分析命令行 ParseCommmandLine, open processOptions 打开输入文件或 读取标准输入,创 pass1 open 建存储输入的临时文件 读取文件,把各行的起始 pass1,trac
15、kLines read 偏移量保存在数组中 反向读取文件,把每行复制 pass2,processLine, lseek 到标准输出,如果选择-c, reverseLine 字符也会逆序输出。 关闭文件,如果是临时文件, pass2 close 删除临时文件,25,名称 功能 stat() 获得文件信息 opendir() 打开目录 readdir() 读目录 closedir() 关闭目录 chown() 改变文件所有者和文件组 chmod() 改变文件权限 dup() 复制文件描述符 fcntl() 对各种文件特性的访问,5.2.4其他文件管理系统调用,26,名称 功能 truncate 截
16、短文件 sync 调度所有文件缓冲区清空到磁盘 mknod 创建特殊文件 link 创建硬链接 ioctl 控制设备 fchown 同chown fchmod 同chmod dup2 同dup ftruncate 同truncate,27,例1:把文件test.txt的组改为cs,该组的组ID为62 /*mychown.c*/ main () int flag; flag = chown (“test.txt“, -1, 62); /* Leave user ID unchanged */ if (flag = -1) perror(“chown.c“); $ls -l test.txt -r
17、w-r-r- 1 glass music 3 May 25 11:42 test.txt $ls -l test.txt -rw-r-r- 1 glass cs 3 May 25 11:42 test.txt,5.2.4其他文件管理系统调用,28,例2:把文件test.txt的权限标志改为600,即只有文件所有者拥有读写权限。 /*mychomod.c*/ main () int flag; flag = chmod (“test.txt“, 0600); /* Use an octal encoding */ if (flag = -1) perror (“chmod.c“); $ls -l
18、 test.txt -rw-r-r- 1 glass music 3 May 25 11:42 test.txt $ls -l test.txt -rw- 1 glass cs 3 May 25 11:42 test.txt,5.2.4其他文件管理系统调用,29,例3:创建一个文件test.txt,然后通过4个不同的文件描述符写这个文件。 /*mydup.c*/ #include #include main () int fd1, fd2, fd3; fd1 = open (“test.txt“, O_RDWR | O_TRUNC); printf (“fd1 = %dn“, fd1); wr
19、ite (fd1, “whats“, 6);,5.2.4其他文件管理系统调用,30,例3:续 fd2 = dup (fd1); /* Make a copy of fd1 */ printf (“fd2 = %dn“, fd2); write (fd2, “ up“, 3); close (0); /* Close standard input */ fd3 = dup (fd1); /* Make another copy of fd1 */ printf (“fd3 = %dn“, fd3); write (0, “ doc“, 4); dup2 (fd3, 2); /* Duplicat
20、e channel 3 to channel 2 */ write (2, “?n“, 2); ,5.2.4其他文件管理系统调用,31,读取文件属性,32,struct stat,33,读取文件属性代码,if(stat(argv1,34,打开/关闭目录文件,35,读写目录内容,36,示例,37,定位目录位置,38,添加删除目录,39,返回/修改当前工作路径操作,40,示例,41,进程相关的定义: 1 进程是一个独立的可调度的活动。 进程是一个抽象实体,当它执行某个任务时,要分配和释放各种资源。 进程是可以并行执行的计算部分。 进程是一个具有独立功能的程序,关于某个数据集合的一次可以并发执行的活
21、动,是处于活动状态的计算机程序。是Linux系统基本调度单位。 进程和程序的区别: 几个进程可以并发的执行一个程序 一个进程可以顺序的执行几个程序,5.3 进程管理,42,Linux进程是一个正在运行或可运行的程序的唯一实例。 Linux系统中的每个进程都具有下列属性: 一些代码 一些数据 一个堆栈 一个唯一的进程号PID Init进程:linux系统启动时,系统中只有一个可见进程,叫init,其PID为1。在linux创建进程的唯一方法是复制现有进程,所以init进程是所有随后进程的祖先进程。,5.3 进程管理,43,当一个进程复制时,父进程和子进程实际上是完全相同的(除了PID,PPID和
22、运行库等。) 子进程的代码、数据和堆栈是父进程的副本。但是子进程也许会把代码替换为另一个可执行文件的代码,将自己和父进程区分开来。 子进程终止时,系统将它的死亡消息传递给父进程,以便父进程采取适当的操作。,5.3.1 父进程和子进程,44,5.3.2 进程的状态,一个既在的进程调用fork创建一个新进程,TASK_ZOMBIE(进程被终止),TASK_RUNNING(就绪,但是没有在运行),TASK_RUNNING(正在运行),进程等待中,Task forks,进程调度选择一个task,进程被高优先级的进程抢占,进程调用do_exit()终止执行,进程睡眠,在等待特定事件或资源的等待队列上,事
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 系统 调用 new
链接地址:https://www.31doc.com/p-2563346.html