02.系统调用与标准IO库

合集下载

C++程序设计常用库函数

C++程序设计常用库函数

C++程序设计常用库函数本文主要波及两类库函数,运转期库(run-time library) 和C++ 标准库。

下边简单介绍这些库的使用要点。

运转期库是用 C 语言实现的基础程序库,其余库都以此为基础。

MSDN 将运转期库按功能区分,如表 B-1 所示。

来自 MSDN Library Visual Studio 6.0Visual C++ DocumentationUsing Visual C++Visual C++ Programmers ’s GuideRun-Time Library ReferenceRun-Time Routines by Category表 B-1 运转期库分类功能有关头文件 ( 不完好 )可变参数用于定义可变参数的函数<stdarg.h>缓冲区管理按字节管理内存缓冲区<string.h><memory.h>按字节分类多字节字符分类,与目前多字节代码页有关<ctype.h>按字符分类对单字节字符、宽字符、多字节字符进行分<ctype.h>类。

比较常用,如 isalpha, isprint 。

数据变换一种数据变换到另一种,比如字符串到int <math.h><stdlib.h>或 double ,或反之。

有好多变换既有函数实现,也有宏实现,可选择。

调试程序debug 调试,函数库中有特意的调试版本,<assert.h><crtdbg.h>支持单步履行、断言、错误检测、异样,跟踪堆空间分派,防止内存泄漏,以及调试信息报告等。

目录控制读取或改变目录,创立、删除目录等,也包<stdlib.h><direct.h>括使用环境路径来搜寻文件错误办理包含断言、检测 IO 错误、消除错误标志、<assert.h><crtdbg.h><stdio.h>判断初级 IO 的文件尾 eof 等。

系统调用与库函数的区别与联系

系统调用与库函数的区别与联系

系统调用与库函数的区别与联系系统调用和库函数是操作系统中常见的两种程序接口,它们在实现功能上有一些相似之处,但是在使用和原理上也存在一些明显的区别。

首先,系统调用是操作系统提供给用户程序的一种接口,用于让用户程序能够请求操作系统内核的服务。

系统调用是操作系统核心的一部分,它提供了访问操作系统核心功能的唯一途径,可以执行诸如文件操作、进程管理、内存管理等操作。

用户程序无法直接访问操作系统内核,只能通过系统调用的方式向操作系统发出请求,由操作系统核心来完成具体的工作。

系统调用是操作系统与用户程序之间的桥梁,用于实现用户程序与操作系统之间的交互。

库函数则是由编程语言或第三方库提供的函数,用于封装一些常用的操作,方便用户程序调用。

库函数是在用户空间内实现的,它们并不直接与操作系统内核交互,而是通过系统调用来实现与操作系统的通信。

库函数常用于封装复杂的系统调用操作,提供更加简洁易用的接口,使得用户程序能够更加方便地实现各种功能。

在区别上,系统调用是操作系统提供给用户程序的接口,是操作系统核心的一部分,用于实现系统功能;而库函数是编程语言或第三方库提供的函数,用于封装一些常用的操作,方便用户程序调用。

系统调用需要通过操作系统内核来执行具体的工作,而库函数是在用户空间内实现的,不直接与操作系统内核交互。

另外,系统调用通常耗时较长,因为需要进行用户模式和内核模式的切换;而库函数则可以直接在用户空间中执行,不需要切换操作模式。

尽管系统调用和库函数有明显的区别,但它们之间也有联系,即库函数通常是通过系统调用来实现具体功能的。

在用户程序调用库函数时,库函数内部可能会调用系统调用完成一些特定的操作,比如文件读写、网络通信等。

因此,库函数和系统调用是相辅相成的,库函数提供了更高层次的接口,便于用户程序开发,而系统调用提供了最基本的操作系统功能,用于实现库函数所需的底层功能。

总的来说,系统调用和库函数是操作系统中非常重要的两种接口,它们在功能和使用上有着明显的区别,但也存在着联系。

系统调用和库函数

系统调用和库函数

系统调用和库函数一、什么是系统调用和库函数1.1 系统调用系统调用是操作系统提供给应用程序访问操作系统服务的接口。

它们允许应用程序执行诸如文件操作、进程管理、网络通信等底层任务。

系统调用是应用程序与操作系统之间的桥梁,通过系统调用,应用程序可以请求操作系统完成一些特定的任务。

1.2 库函数库函数是由开发人员编写的可供应用程序调用的函数。

与系统调用不同,库函数是在应用程序中直接调用的函数,它们封装了一些常用的功能,例如字符串处理、数学运算等。

库函数为开发人员提供了一种方便的方式来重用代码,简化开发过程。

二、系统调用和库函数的区别和联系2.1 区别•系统调用是操作系统提供的接口,而库函数是由开发人员编写的函数。

•系统调用是底层的、直接与操作系统交互的接口,而库函数是对系统调用的封装和扩展。

•库函数是在应用程序内部直接调用的,而系统调用需要通过软中断或系统调用机制触发操作系统的相应功能。

•库函数的执行速度通常比系统调用快,因为库函数不需要频繁地切换上下文。

2.2 联系系统调用和库函数之间也存在联系:•库函数通常会依赖于系统调用来完成一些底层的任务,例如文件操作、进程管理等。

•库函数可以通过调用系统调用来获得更高的权限和更底层的功能。

•库函数可以将多个系统调用封装成一个更高级别的函数,以供应用程序调用。

三、系统调用的分类和常用系统调用3.1 系统调用分类根据操作系统提供的功能,系统调用可以分为以下几类:1.进程控制:例如创建进程、终止进程、等待进程等。

2.文件操作:例如打开文件、读写文件、关闭文件等。

3.设备操作:例如打开设备、读写设备等。

4.进程间通信:例如信号量操作、管道通信、共享内存等。

5.网络通信:例如套接字操作、网络数据传输等。

6.内存管理:例如分配内存、释放内存等。

3.2 常用系统调用•fork:用于创建新的进程。

•execve:用于执行新的程序。

•open:用于打开文件。

•read:用于从文件中读取数据。

C语言IO操作

C语言IO操作

标准输⼊流0STDIN_FILENO stdin 标准输出流1STDOUT_FILENO stdout 标准错误流2STDERR_FILENO stderr C语⾔IO操作⽂件的概念和类型 概念:⼀组相关数据的有序集合 ⽂件类型:1. 常规⽂件 r2. ⽬录⽂件 d3. 字符设备⽂件 c4. 块设备⽂件 b5. 管道⽂件 p, 进程间通信的机制6. 套接字⽂件 s, 进程间通信的机制7. 符号链接⽂件 l如何理解标准IO 标准IO由ANSIC标准定义,就是⽤标准C语⾔定义好的⼀组⽤来输⼊和输出的API 主流操作系统(Linux,Windows)上都实现了C库 标准IO通过缓冲机制减少系统调⽤,实现更⾼的效率流(FILE)的含义 标准IO⽤⼀个结构体数据类型来存放打开的⽂件的相关信息 标准IO的所有操作都围绕FILE来进⾏ FILE⼜被称为流(stream) 流分为两种流分别是 ⽂本流:Windows系统中⽂本流的换⾏符占⽤两个字节⽤“\r\n”表⽰,LInux中⽤‘\n’表⽰ ⼆进制流:Windows系统⼆进制流的换⾏符占⽤⼀个字节⽤“\n”表⽰,LInux中⽤‘\n’表⽰流的缓冲 全缓冲:当流的缓冲区⽆数据或⽆空间时才执⾏实际IO操作 ⾏缓冲:当在输⼊和输出中遇到换⾏符“\n”时,进⾏IO操作;当流和⼀个终端关联时,是典型的⾏缓冲 ⽆缓冲:数据直接写⼊⽂件,流不进⾏缓冲,⼀般在打印错误信息时使⽤ 标准IO预定义3个流,程序运⾏时⾃动打开流的打开 下列函数可⽤于打开⼀个标准IO流 FILE *fopen(const char *path, const char *modle); 成功时返回流指针;出错时返回NULL model参数模式描述r或rb打开⼀个已有的⽂本⽂件,允许读取⽂件。

w或wb 打开⼀个⽂本⽂件,允许写⼊⽂件。

如果⽂件不存在,则会创建⼀个新⽂件。

在这⾥,您的程序会从⽂件的开头写⼊内容。

系统调用原理

系统调用原理

系统调用原理(最新版)目录1.系统调用的概念与作用2.系统调用的分类3.系统调用的实现原理4.系统调用的应用实例5.系统调用与用户程序的关系正文一、系统调用的概念与作用系统调用(System Call)是操作系统向用户程序提供的一种申请操作系统服务的接口。

用户程序通过系统调用请求操作系统的帮助,完成文件操作、进程管理、内存管理等任务。

系统调用是操作系统与用户程序之间的桥梁,使得用户程序可以更加高效地使用操作系统的功能。

二、系统调用的分类根据系统调用的功能,可以将其分为以下几类:1.文件操作:包括创建文件、打开文件、读取文件、写入文件、关闭文件等。

2.进程管理:包括创建进程、终止进程、切换进程、获取进程信息等。

3.内存管理:包括分配内存、释放内存、复制内存等。

4.设备管理:包括设备分配、设备回收、设备操作等。

5.其他系统服务:包括获取系统时间、随机数生成等。

三、系统调用的实现原理系统调用的实现原理可以分为以下几个步骤:1.用户程序调用库函数:用户程序调用库函数,如 C 语言的标准库函数,来实现文件操作、进程管理等功能。

2.库函数调用系统调用:库函数通过调用系统调用来请求操作系统提供相应的服务。

3.操作系统处理:操作系统根据系统调用的类型,执行相应的操作,如文件操作、进程管理等。

4.返回结果:操作系统将处理结果返回给库函数。

5.库函数返回结果给用户程序:库函数将操作系统返回的结果返回给用户程序。

四、系统调用的应用实例以下是一个简单的系统调用应用实例,使用 C 语言编写,通过系统调用实现文件的创建和写入功能:```c#include <stdio.h>#include <unistd.h>int main() {int fd = open("example.txt", O_CREAT | O_TRUNC | O_WRONLY, 0644);if (fd < 0) {perror("open");return -1;}write(fd, "Hello, system call!", 25);close(fd);return 0;}```五、系统调用与用户程序的关系系统调用是操作系统为用户程序提供的一种服务接口,用户程序通过系统调用来请求操作系统的帮助,实现文件操作、进程管理等功能。

标准IO文件IO

标准IO文件IO

2016.9.21标准I/O库流和file文件:File指针结构体类型标准I/O库的操作都是围绕流来进行的用流用file*来描述流:文本流:数据以字符出现“\n“ 被转换为0DH和0AH二进制流:处理的是二进制序列文件缓存:缓存文件系统(高级磁盘ID):少用read/write的调用分类:全缓存,行缓存,不缓存全缓存:系统通过调用malloc来获得需要的缓存区域,默认值刷新(fflush)行缓存:遇到‘\n’时流遇到一个终端时不带缓存:不对字符进行缓存(etc:stderr)非缓存文件系统(低级磁盘ID):用操作系统来完成用Setbuf()和setvbuf()更改缓存类型标准I/O库-打开流FILE*Fopen(constchar *path, const char *mode)打开由path(路径)指定的文件默认会有一个0666的权限Mode的参数:Char *Freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp)FILE *Fdopen(int filedes, const char *type)Example1->fopen:Example2->freopen:Example3->fdopen关闭流Fclose()调用成功返回0失败返回EOF,并设置error标准I/O库-读写流每次一个字符的I/O:int fgetc(FILE *stream)/int fputc(int c, FILE *stream)每次一行的I/O:int fgets(char *s, int size, FILE *stream)/int fputs(const char *s, FILE *stream)直接I/O:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)读写流结束判定Int Feof(FILE *stream)判断文件是否结束(可用于二进制)EOF/feof()文件结束时标志实例晚上完善(例程基本上都是在修改while();)字符I/O输入Int Getc(FILE *stream);Int Fgetc(FILE *stream);Int Getchar(void);注:getchar()等价于getc(stdin)出错函数Int Feof(FILE *stream);Int Ferror(FILE *stream);Int Clearerr(FILE *stream);字符I/O输出Int Putc(int c, FILE *stream);Int Fputc(int c, FILE *stream);Int Putchare(int c);注:Putchar(c)等价于putc(c, stdout)行I/O输入Char*gets(char *s);Char*fgets(char*s, int size, FILE *stream);行I/O输出Intputs(const char *s);Intfputs(const char*s, FILE *stream);二进制I/OSize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);Size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);标准I/O库-读写流Int Fseek(FILE *stream, long offset, int whence);Long Ftell(FILE *stream);Void Rewind(FILE *stream);注意:rewind()等价于(void)fseek(stream,0L,SEEK_SET)Time2016.9.22文件I/O不带缓冲指的是每个read和write都调用内核中的相应系统调用操作函数:Open();Close();Read();Write();Lseek();文件描述符:对于内核而言,所有打开的文件都由文件描述符引用文件I/O操作三部文件I/O---open()Open可以打开任何文件包括设备文件但是不能创建设备文件Open的参数Example1:文件I/O---close()文件I/O---read()读操作是从当前位移量开始文件I/O---write()出错原因: 磁盘已满或超出给定长度对于普通文件来说写操作从当前位移量处开始,如果加了O_APPEND则在当前结尾处;文件I/O---lseek()读写都是从当前位置处开始lseek()只对常规文件有效lseek()仅当前文件的位移量记录在内核中,它并不引起任何I/O操作标准I/O和文件I/O的区别文件和目录获取文件目录的属性信息Stat()文件名fstat()文件描述符lstat()文件名取得文件类型:目录文件普通文件字符特殊文件块特殊文件FIFO套接口符号链接取得文件类型--检测宏:取得文件类型--St_mode定义:取得文件类型--文件存取许可权限:静态库和动态库本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行在linux下库分为:静态库和动态库静态库静态库对函数库的链接是放在编译时期完成的。

io模块的使用方法

io模块的使用方法

io模块的使用方法io模块是Python中用于进行输入输出操作的标准库之一,它提供了一系列函数和类,方便我们进行文件读写、网络通信等操作。

本文将介绍io模块的使用方法。

一、文件读写1. 打开文件使用open函数可以打开一个文件,并返回一个文件对象。

open函数的第一个参数是文件路径,第二个参数是打开模式。

常用的打开模式有:- 'r':只读模式,文件必须存在- 'w':写入模式,如果文件不存在则创建,如果文件存在则清空内容- 'a':追加模式,在文件末尾添加内容,如果文件不存在则创建- 'x':独占创建模式,只能创建新文件,如果文件已存在则报错例如,要打开一个名为"test.txt"的文件,可以使用以下代码:```pythonfile = open("test.txt", "r")```2. 读取文件内容文件对象有多种读取内容的方法,常用的有:- read(size):读取指定大小的内容,如果不指定大小则读取整个文件内容- readline():读取一行内容- readlines():读取所有行,并返回一个列表,每行作为列表的一个元素示例代码:```pythonfile = open("test.txt", "r")content = file.read()print(content)```3. 写入文件内容文件对象有多种写入内容的方法,常用的有:- write(str):写入字符串- writelines(lines):写入多行,参数是一个字符串列表示例代码:```pythonfile = open("test.txt", "w")file.write("Hello, world!")file.close()```二、网络通信1. TCP通信io模块提供了socket类,可以用于进行TCP通信。

linux系统编程试卷(答案)

linux系统编程试卷(答案)

凌阳教育嵌入式培训系统编程部分测试试题注:考试为闭卷,程序题需上机操作运行出结果,考试时间为120分钟一:选择题(本题共4小题,每题3分共12分)1)下列不是Linux系统进程类型的是( D )A 交互进程B 批处理进程C 守护进程D 就绪进程(进程状态)2)以下对信号的理解不正确的是( B )A 信号是一种异步通信方式B 信号只用在用户空间进程通信,不能和内核空间交互C 信号是可以被屏蔽的D 信号是通过软中断实现的3)进程有三种状态( C )A 准备态、执行态和退出态B 精确态、模糊态和随机态C 运行态、就绪态和等待态D 手工态、自动态和自由态4)不是进程和程序的区别( B)A 程序是一组有序的静态指令,进程是一次程序的执行过程B 程序只能在前台运行,而进程可以在前台或后台运行C 程序可以长期保存,进程是暂时的D 程序没有状态,而进程是有状态的二:填空题(本题共6小题,2)、3)两题每空四分,其余每空一分。

共23分)1) 列举八种常见的进程间通信方式无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字网络上两个主机的进程间通信方式为套接字2) 命名管道比无名管道的优势提供了一个可以访问的路径名,实现没亲缘关系的进程间通信3) 消息队列比命名管道和无名管道的优势可以按类型实现消息的随机查询,没必要先进先出4) 按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数据库5) 在C语言中操作sqlite数据库,常用的2中方式是sqlite_exec(回调)、sqlite_gettable(非回调)6) 列举四种进程调度算法先来先调度(FCFS)、短进程优先调度(SPF)、高优先级调度(HPF)、时间片轮转调度三:问答题(本题共7题,每题5分,共35分)1) 什么是系统调用?系统调用是通过什么方式陷入内核态的?请写出你对系统调用的理解。

什么是文件I/O和标准I/O库?文件I/O和标准I/O库的区别?系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组接口获得操作系统内核提供的服务。

计算机操作系统慕课版课后答案

计算机操作系统慕课版课后答案

计算机操作系统慕课版课后答案目标:提高系统资源的利用率诸如CPU,I/O设备,内存空间等资源。

提高系统的吞吐量,也就是通过操作系统可以合理地组织计算机的工作流程,提高资源利用利率,加速程序的运行,缩短程序的运行周期。

提高系统的吞吐量。

作用:对处理器,存储器,I/O设备,和信息(数据和程序)这四类资源进行管理。

(2)试说明OS与硬件、其它系统软件以及用户之间的关系?给用户提供一个管理界面,用来管理硬件的运行,给软件提供基础。

(3)试说明推动OS发展的主要动力是什么?计算机系统的性能的快速提高,硬件成本的下降,不断增长的应用需求都也促使操作系统的性能和结构有了显著提高,也促进了操作系统的不断更新升级。

(4)在OS中,何谓脱机IO和联机IO?脱机IO:事先将装有用户程序和数据的纸带装入纸带输入机,在一台外围机的控制下,把纸带上的数据输入到磁带上。

当CPU需要这些程序和数据时,再从磁带上高速地调入内存。

该方式下的输入输出由外围机控制完成,是在脱离主机的情况下进行的。

联机IO:在主机的直接控制下进行输入/输出的方式,称为联机输入/输出(On-Line I/O)方式。

是指作业的输入、调入内存及结果输出都在cpu直接控制下进行。

(5)试说明推动分时系统形成和发展的主要动力是什么?满足用户的需要。

CPU的分时使用缩短了作业的使用周期;人机交互能力使用户能直接的控制自己的作业;主机的共享使多个用户能同时使用同一台计算机,独立处理自己的作业(6)实现分时系统的关键问题是什么?应如何解决?关键问题:当用户在自己的终端上键入命令时,系统应能及时接收并及时处理该命令,在用户能接受的时延内将结果返回给用户。

解决方法:针对及时接收问题,在系统中设置多路卡,使主机能同时接收用户从各个终端上输入的数据;为每个终端配置缓冲区,暂存用户键入的命令或数据。

针对及时处理问题,应使所有的用户作业都直接进入内存,并且为每个作业分配一个时间片,允许作业只在自己的时间片内运行,这样在不长的时间内,能使每个作业都运行一次。

Linux IO及文件编程

Linux IO及文件编程

2. C标准I/O库函数与Unbuffered I/O函数现在看看C标准I/O库函数是如何用系统调用实现的。

fopen(3)调用open(2)打开指定的文件,返回一个文件描述符(就是一个int类型的编号),分配一个FILE结构体,其中包含该文件的描述符、I/O缓冲区和当前读写位置等信息,返回这个FILE结构体的地址。

fgetc(3)通过传入的FILE *参数找到该文件的描述符、I/O缓冲区和当前读写位置,判断能否从I/O缓冲区中读到下一个字符,如果能读到就直接返回该字符,否则调用read(2),把文件描述符传进去,让内核读取该文件的数据到I/O缓冲区,然后返回下一个字符。

注意,对于C标准I/O库来说,打开的文件由FILE *指针标识,而对于内核来说,打开的文件由文件描述符标识,文件描述符从open系统调用获得,在使用read、write、close系统调用时都需要传文件描述符。

fputc(3)判断该文件的I/O缓冲区是否有空间再存放一个字符,如果有空间则直接保存在I/O缓冲区中并返回,如果I/O缓冲区已满就调用write(2),让内核把I/O缓冲区的内容写回文件。

fclose(3)如果I/O缓冲区中还有数据没写回文件,就调用write(2)写回文件,然后调用close(2)关闭文件,释放FILE结构体和I/O缓冲区。

以写文件为例,C标准I/O库函数(printf(3)、putchar(3)、fputs(3))与系统调用write(2)的关系如下图所示。

图 28.1. 库函数与系统调用的层次关系读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回。

从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里。

同样,写常规文件是不会阻塞的,而向终端设备或网络写则不一定。

简述系统调用的实现过程

简述系统调用的实现过程

简述系统调用的实现过程系统调用是操作系统提供给用户程序的一种服务机制,用户程序可以通过系统调用来向操作系统发出请求,以获取需要的服务。

系统调用的实现过程可以分为以下几个步骤:1.客户程序发出系统调用请求:当用户程序需要操作系统提供的项服务时,它会通过指定的接口函数(通常是一个特定的汇编指令或函数调用)向操作系统发出系统调用请求。

这个接口函数通常被包含在操作系统的动态链接库中,用户程序通过加载并调用该库中的函数来实现系统调用。

2.用户程序传递参数:用户程序在发出系统调用请求时,通常需要传递给操作系统一些参数,以指定需要的服务和操作。

这些参数通常被存储在特定的寄存器或栈帧中,并通过调用操作系统的接口函数来传递给操作系统。

3.用户程序切换到内核模式:在进行系统调用时,用户程序需要从用户模式切换到内核模式。

这是因为系统调用需要访问操作系统的内核空间,而用户程序只能访问自己的用户空间。

为了实现这一切换,处理器会通过异常或中断的方式将控制权转移到操作系统的特定处理程序中,使得操作系统可以执行系统调用服务。

4.操作系统处理请求:当操作系统接收到用户程序发出的系统调用请求后,它会根据用户程序提供的参数和请求类型来执行相应的操作。

操作系统会根据请求的性质,执行相应的服务并返回结果。

5.操作系统返回结果给用户程序:在操作系统完成请求的处理后,它会将结果返回给用户程序。

返回结果通常也通过寄存器或栈帧来传递,并通过操作系统的接口函数返回给用户程序。

6.返回用户模式:当操作系统返回结果给用户程序后,用户程序会从内核模式切换回用户模式。

这样用户程序就可以继续执行后续的指令,并对操作系统返回的结果进行处理和使用。

总结起来,系统调用的实现过程包括发出系统调用请求、传递参数、切换到内核模式、操作系统处理请求、返回结果给用户程序以及返回用户模式等步骤。

通过这个过程,用户程序可以利用操作系统提供的服务来完成各种任务。

系统调用是操作系统与用户程序之间的桥梁,它为用户程序提供了一种方便且安全地访问操作系统功能的手段。

计算机操作系统名词解释总结

计算机操作系统名词解释总结

计算机操作系统名词解释总结计算机操作系统有很多专业名词,很多小伙伴相信都一知半解,下面由店铺整理了计算机操作系统名词解释总结,希望对你有帮助。

计算机操作系统名词解释总结一1.脱机输入输出(off—line input/output) 指在外围计算机的控制下,实现程序和数据的输入输出;或者说它们是脱离主机进行的,故称为脱机输入输出。

2.联机输入输出(on—line input/output) 指在主机直接控制下,进行输入输出操作的工作方式,称为联机输入输出。

3.批处理技术(batch processing technic) 指在管理程序的控制下,对一批作业自动进行处理而不需人工干预的一种技术。

该技术旨在提高系统的吞吐量和资源利用率。

4.多道程序设计(multiprograming) 指在内存中同时存放若干个作业,并使它们同时运行的一种程序设计技术。

在单处理机环境下,仅在宏观上这些作业在同时运行,而在微观上它们是在交替执行。

即每一时刻只有一个作业在执行,其余作业或处于阻塞状态,或处于就绪状态。

5.操作系统(operating system) 操作系统是控制和管理计算机硬件与软件资源,合理地组织计算机的工作流程,以及方便用户的程序的集合。

其主要功能是实现处理机管理、内存管理、IO设备管理、文件管理以及作业管理。

6.系统吞吐量(system throughput) 指系统在单位时间内所完成的作业数目。

7.作业周转时间从作业进入系统开始,到作业完成并退出系统所经历的时间。

8.分时操作系统(time- sharing operating system) 指允许若干个联机用户,通过各自的终端同时使用一台计算机的操作系统。

为实现人-机交互,系统把处理机时间分割成若干时间片后,轮流为每个终端分配一个时间片运行其作业。

即让每,个终端作业运行一个时间片后,便暂停其运行而把CPU再分配给下一个终端作业,也运行一个时间片。

简述系统调用的实现过程

简述系统调用的实现过程

简述系统调用的实现过程1. 什么是系统调用系统调用是指在操作系统中运行的程序或应用程序向操作系统请求服务或资源的一种机制。

它是用户空间和内核空间之间的接口,用户空间的程序无法直接访问内核空间的资源,必须通过系统调用来获取需要的资源或服务。

2. 系统调用的分类常见的系统调用包括文件操作、进程管理、网络通信、设备访问等。

它们通常可分为以下几类:- 进程控制:如fork、execve、exit等。

- 文件操作:如open、read、write、close等。

- 设备管理:如ioctl、munmap等。

- 进程通信:如pipe、mmap、socket等。

- 网络通信:如connect、sendto、recvfrom等。

3. 系统调用的实现过程当用户空间的程序需要使用系统调用时,通常会先通过标准库中的相关函数(如open、write、read等)间接调用系统调用。

这些函数会将需要的参数传递给相应的系统调用函数,再通过软中断(软中断是一种特殊的硬件中断)进入内核空间。

在内核空间中,操作系统会根据系统调用的编码(即系统调用号)来确定需要执行哪个系统调用函数。

系统调用函数会获取用户态传递的参数,然后执行系统调用的任务,并将执行结果返回给用户态。

返回结果的过程与调用过程相反,操作系统会将结果保存在指定的内存中,然后通过软中断返回用户空间。

用户程序就可以根据系统调用的返回值来确定执行结果是否正确。

4. 系统调用的性能优化系统调用通常需要切换用户态和内核态,这个切换过程有一定的开销,因此需要尽可能地减少系统调用的使用。

优化系统调用的方法包括:- 使用更高级别的库函数,如使用mmap代替read和write。

- 使用本地缓存,例如使用mmap将文件映射为一个内存区域,避免频繁读取磁盘。

- 将多个系统调用合并为一个,减少切换的次数。

- 使用异步I/O操作,通过回调函数等方式避免阻塞等待系统调用结果。

c语言获取操作系统信息的方法

c语言获取操作系统信息的方法

获取操作系统信息是C语言程序中常见的需求,可以帮助程序员了解程序运行环境,为程序的稳定运行提供基础信息。

下面将介绍一些常用的C语言获取操作系统信息的方法。

一、使用系统调用获取操作系统信息1.1 uname系统调用uname系统调用可以获取操作系统的信息,包括操作系统的名称、版本、发布号等。

在C语言中,可以使用<sys/utsname.h>头文件提供的结构体和uname函数来调用该系统调用。

示例代码如下:```c#include <sys/utsname.h>#include <stdio.h>int main() {struct utsname uts;if(uname(&uts) != -1) {printf("操作系统名称:%s\n", uts.sysname);printf("节点名称:%s\n", uts.nodename);printf("版本号:%s\n", uts.release);printf("发行号:%s\n", uts.version);printf("硬件类型:%s\n", uts.machine);}return 0;}```1.2 sysctl系统调用sysctl系统调用可以获取系统的各种信息,包括操作系统的版本、架构、网络配置等。

在C语言中,可以使用<sys/sysctl.h>头文件提供的函数来调用该系统调用。

示例代码如下:```c#include <sys/types.h>#include <sys/sysctl.h>#include <stdio.h>int main() {char os_version[256];size_t len = sizeof(os_version);if(sysctlbyname("kern.osversion", os_version, &len, NULL, 0) == 0) {printf("操作系统版本号:%s\n", os_version);}return 0;}```二、读取环境变量获取操作系统信息2.1 getenv函数环境变量中包含了很多系统相关的信息,可以使用getenv函数来获取这些信息。

系统调用和库函数

系统调用和库函数

系统调用和库函数一、系统调用系统调用是操作系统提供给应用程序的接口,它允许应用程序请求操作系统执行某些特权操作,例如读写文件、创建进程、打开网络连接等。

在Linux系统中,系统调用是通过软中断来实现的。

1.1 系统调用的分类Linux系统中有很多种类型的系统调用,按照功能可以分为以下几类:1. 进程控制类:如fork()、exec()等;2. 文件操作类:如open()、read()、write()等;3. 设备操作类:如ioctl()、mmap()等;4. 网络通信类:如socket()、connect()等;5. 内存管理类:如mmap()、brk()等。

1.2 系统调用的使用方法在C语言中,可以使用unistd.h头文件中定义的函数来进行系统调用。

例如:#include <unistd.h>int main(){char buf[1024];int fd = open("test.txt", O_RDONLY);read(fd, buf, sizeof(buf));close(fd);return 0;}上面的代码就是使用了open()和read()两个系统调用来读取一个文本文件。

二、库函数库函数是一组预先编写好的函数集合,可以被应用程序直接调用。

库函数通常被编译成动态链接库或静态链接库,以便于应用程序使用。

在Linux系统中,常见的库函数有标准C库函数、数学库函数、字符串处理库函数等。

2.1 标准C库函数标准C库函数是C语言提供的一组基本的函数,包括输入输出、字符串处理、内存管理等方面。

在Linux系统中,标准C库通常是glibc。

下面是一些常用的标准C库函数:1. 输入输出类:printf()、scanf()、fopen()、fclose()等;2. 字符串处理类:strcpy()、strcat()、strlen()等;3. 内存管理类:malloc()、calloc()、realloc()等。

系统调用的实现原理【转】

系统调用的实现原理【转】

系统调⽤的实现原理【转】在看《unix/linux编程实践教程》时,忽然意识到,系统调⽤是如何实现的?在实际编程中,往往是调⽤相关的函数,⽐如open(),read()等等。

但是调⽤这些函数怎么可能让程序的运⾏在⽤户空间和内核空间切换呢?看了下⾯的⽂章,才知道怎么回事。

让我想到了《计算机组成原理》中讲到的东西。

原⽂地址:系统调⽤1什么是系统调⽤系统调⽤,顾名思义,说的是操作系统提供给⽤户程序调⽤的⼀组“特殊”接⼝。

⽤户程序可以通过这组“特殊”接⼝来获得操作系统内核提供的服务,⽐如⽤户可以通过⽂件系统相关的调⽤请求系统打开⽂件、关闭⽂件或读写⽂件,可以通过时钟相关的系统调⽤获得系统时间或设置定时器等。

从逻辑上来说,系统调⽤可被看成是⼀个内核与⽤户空间程序交互的接⼝——它好⽐⼀个中间⼈,把⽤户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给⽤户空间。

系统服务之所以需要通过系统调⽤来提供给⽤户空间的根本原因是为了对系统进⾏“保护”,因为我们知道Linux的运⾏空间分为内核空间与⽤户空间,它们各⾃运⾏在不同的级别中,逻辑上相互隔离。

所以⽤户进程在通常情况下不允许访问内核数据,也⽆法使⽤内核函数,它们只能在⽤户空间操作⽤户数据,调⽤⽤户空间函数。

⽐如我们熟悉的“hello world”程序(执⾏时)就是标准的⽤户空间进程,它使⽤的打印函数printf就属于⽤户空间函数,打印的字符“hello word”字符串也属于⽤户空间数据。

但是很多情况下,⽤户进程需要获得系统服务(调⽤系统程序),这时就必须利⽤系统提供给⽤户的“特殊接⼝”——系统调⽤了,它的特殊性主要在于规定了⽤户进程进⼊内核的具体位置;换句话说,⽤户访问内核的路径是事先规定好的,只能从规定位置进⼊内核,⽽不准许肆意跳⼊内核。

有了这样的陷⼊内核的统⼀访问路径限制才能保证内核安全⽆虞。

我们可以形象地描述这种机制:作为⼀个游客,你可以买票要求进⼊野⽣动物园,但你必须⽼⽼实实地坐在观光车上,按照规定的路线观光游览。

IO系统调用原理介绍

IO系统调用原理介绍

IO系统调用原理介绍
下面是IO系统调用的原理和流程介绍。

1. 用户程序发起IO请求:应用程序通过系统提供的IO相关函数发起IO请求。

例如,如果要读取文件,应用程序会调用read(函数,如果要写入文件,应用程序会调用write(函数。

2.系统调用进入内核态:当应用程序发起IO请求时,CPU会从用户态切换到内核态,将控制权交给操作系统内核。

3.内核处理IO请求:操作系统接收到IO请求后,会根据请求的类型和参数进行相应的处理。

4.硬件设备访问:操作系统根据IO请求的类型,调用相应的设备驱动程序,将IO请求传递给硬件设备进行处理。

例如,如果是读取文件的IO请求,操作系统会调用磁盘驱动程序将数据从硬盘读取到内存中。

5.等待IO操作完成:在进行IO操作时,可能需要等待硬件设备的响应。

例如,如果是网络IO请求,操作系统可能需要等待网络数据包的传输完成才能继续执行。

6.返回结果给应用程序:当IO操作完成后,操作系统将结果返回给应用程序。

如果是读取文件的请求,操作系统会将读取到的数据拷贝到应用程序指定的缓冲区。

7.应用程序继续执行:一旦IO操作完成并且结果返回给应用程序,操作系统会将控制权重新切换回用户态,应用程序可以继续执行后续的操作。

IO系统调用的原理可以简单总结为:应用程序通过系统调用将IO请求交给操作系统内核,内核根据IO请求类型和参数进行相应的处理,并将请求传递给硬件设备进行实际的IO操作。

当IO操作完成后,操作系统将结果返回给应用程序,应用程序可以根据结果继续执行后续的操作。

标准IO和文件IO的区别(个人收藏)

标准IO和文件IO的区别(个人收藏)

I/O ,主要是打印输出到 屏幕 等。因为他们 设备不一样 ,文件 io 针对的是文
件,标准 io 是对控制台,操作的是字符流。对于不同设备得特性不一样,必须
有不同 api 访问才最高效。
最后来看下他们使用的函数
标准IO
文件IO (低级 IO)
打开
fopen,freopen,fdopen
open
关闭
存储输入的地址,第二个参数为整数,表示输入字符串的最大长度,最后一个 参数就是文件指针,指向要读取的文件。最后是 fscanf,与 scanf类似,只不过
增加了一个参数用于指定操作的文件,比如 fscanf(fp,"%s",words)
*nix 系统中使用 read函数用于读取 open函数打开的文件,函数原型如下:
当我想到这件事时,陆泽突然想洗个澡。他瞥了一眼卢利身上的兔子睡衣,嘴巴抽了。他忍不住有点渴望搬家。兔子想做什么?陆莉在门口看到了陆泽,突然他的身体僵硬,一张漂亮的脸上出现了红光。在感受到吕泽的眼睛后,她的 眼睛闪过,眼睛眯起眼睛微笑着说:“兄弟,你不认识你。”目前的样子就像是对我妹妹特别想到的变态?“陆泽文说,他的嘴巴很尴尬:”放屁!我死了!即使我被明星吃掉了!我对你没有任何特别的想法。“并且”这个男人变态错了 吗?“?Luli略微眨了眨眼睛:”是吗?我记得古代有一个真正香水的故事。“陆泽的脸变了,两千年前你还知道这个故事吗?过度,你好?陆莉看着陆泽微笑着说:”兄弟,进去,不要让阿里的内衣做太多的事情?“鲁泽的嘴巴咂了一 下:”..鬼会做到!!“这真的是一种变态吗?男人可以变态,但不能过多变态?陆子眼睛流传着:“是吗?看来我的兄弟知道,这是多么的过分?“陆泽:”..“开玩笑,他怎么能知道纯洁?只是陆莉,他本能地想要反驳。看着陆泽的僵 硬面孔,陆莉笑了笑他张开了长长的腿,带着一股清香,然后走过吕泽的身边,然后她转过身来,摸了摸手指上的白色戒指,嘴角微微抽搐了一下。鲁泽默默地走进了浴室,他的眼睛先瞥了一眼。他发现没有内衣,他觉得他正在被陆柳扮 演。他摇摇头,洗了一下,下楼,来到武道馆。他发现那个卢丽开始培养了。看到陆泽进来后,陆莉停下脚步,微笑着看着陆泽:“兄弟,你刚才找到阿里的内衣?”陆泽:“ ..”这个人肯定是魔鬼?他说他不想说话。看到陆泽不说话, 陆莉微笑着转移话题:“你哥哥可以指向艾尔我又来了?阿里认为他的武术即将突破。“

简述系统调用的过程

简述系统调用的过程

简述系统调用的过程系统调用是操作系统提供的一种机制,用于让应用程序能够访问操作系统的功能和资源。

它允许应用程序通过执行特定的指令来请求操作系统完成某些操作,如文件读写、网络通信、进程管理等。

系统调用的过程可以简单概括为以下几个步骤:1. 应用程序发起系统调用请求应用程序通过调用特定的系统调用函数来发起系统调用请求。

不同的操作系统会提供不同的系统调用接口,应用程序需要按照相应的接口规范来调用系统调用函数。

在调用系统调用函数时,应用程序需要传递一些参数,以告知操作系统要执行的具体操作。

2. 切换到内核态当应用程序发起系统调用请求时,操作系统会将应用程序从用户态切换到内核态。

用户态和内核态是操作系统的两种运行级别,用户态中的应用程序只能访问受限的资源,而内核态中的操作系统可以访问所有的资源。

通过切换到内核态,应用程序可以获得更高的权限,从而能够执行需要操作系统支持的功能。

3. 执行系统调用在内核态中,操作系统会根据应用程序传递的参数来执行相应的系统调用操作。

系统调用的具体执行过程由操作系统内部的相关代码实现。

操作系统会根据系统调用的类型和参数来执行相应的操作,如打开文件、读取数据、发送网络请求等。

4. 返回系统调用结果系统调用执行完成后,操作系统会将执行结果返回给应用程序。

应用程序可以通过系统调用函数的返回值来获取系统调用的执行结果。

返回值通常用来表示系统调用的执行状态,例如成功与否、错误码等。

5. 切换回用户态系统调用执行完成后,操作系统会将应用程序从内核态切换回用户态。

切换回用户态后,应用程序可以继续执行后续的指令,或者根据系统调用的执行结果来进行相应的处理。

系统调用的过程是操作系统和应用程序之间进行交互的重要方式。

通过系统调用,应用程序可以利用操作系统提供的功能和资源,从而实现更丰富、更复杂的应用。

同时,操作系统可以对系统调用进行权限控制和资源管理,以保证系统的安全性和稳定性。

总结起来,系统调用的过程包括应用程序发起系统调用请求、切换到内核态、执行系统调用、返回系统调用结果和切换回用户态。

嵌入式面试笔试题目——附部分答案

嵌入式面试笔试题目——附部分答案

嵌⼊式⾯试笔试题⽬——附部分答案1 、如何⾃动创建设备⽂件?class_create device_create2、led驱动编写有⼏种⽅式?输⼊⼦系统字符设备驱动总线platform led⼦系统3、如何实现http服务器?tcp服务器:socket4、如何编写守护进程,简述syslog的作⽤?第⼀步:创建进程、杀死⽗进程第⼆步:创建新的会话第三步:改变⼯作路径路径第四步:修改⽂件掩码权限第五步:关闭⽂件描述符5、bootloader和uboot的区别?bootloader是启动装载。

这是⼀段很⼩的程序,⽤于在系统上电启动初期运⾏,初始化关键接⼝,如内存,串⼝,关闭中断,关闭看门狗,引导系统进⼊内核的⼀段初始化的程序。

它主要任务就是将内核映像从硬盘读到RAM中,然后跳转到内核的⼊⼝点去运⾏内核,从⽽建⽴系统运⾏的必要环境。

uboot:是bootloader的⼀种6、如何移植uboot?1、下载源码2、解压uboot源码并进⼊⽬录3、指定交叉编译⼯具链4、指定产品BOARD 底板5、编译u-boot7、传感器驱动如何编写?8、BL0,BL1,BL2,BL3的作⽤?BL0 ⽂件是存放在 CPU 内部 IROM 中的⼀段固化代码,CPU 上点之后,⾸先去运⾏soc中的BL0,运⾏时会将 BL1 拷贝到 CPU 的 IRAM 中,然后执⾏BL1;BL1⽂件执⾏起来之后会先进⾏内存的初始化,之后将 BL2 ⽂件拷贝到外部内存中,BL2会初始化BL3的运⾏环境,将BL3搬移到DRAM中,BL3会有⼀个⾃搬移的过程,从⽽启动内核⼊⼝。

BL0:CPU内部的固化代码BL1:三星提供的加密⽂件BL2:截取uboot.bin 前14kBL3:剩下的uboot 执⾏命令以及加载引导内核9、exynos4412 时钟 APLL,MPLL,VPLL的区别?------倍频锁相环APLL:⽤于 CPU_BLK (可产⽣⾼达1.4GHz的频率);作为 MPLL 的补充,它也可以给DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和 CMU_TOP 提供时钟。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定位流 ¾ rewind函数的功能是把文件指针设置为0,即 让fp指向文件的起始位置. ¾ fgetpos将文件位置指示器的当前值存入由 pos指向的对象中.在以后调用fsetpos时,可 以使用此值将流重新定位到该位置.
格式化输出 int printf(const char *format, …) int fprintf(FILE *fp, const char*format, …) int sprintf(char *buf, const char *format, …) int snprintf(char *buf, size_t n,const char *format,…) printf标准输出,输出到屏幕.f开头的格式化 输 出到文件,s开头的格式化输出到buf字符数组. sprintf函数没有指定写入的字符数,可能会造 成由buf指向的缓冲区溢出。Snprintf解决了这个 问题
标准IO库
• 无论编写系统程序还是应用程序,都离不开I/O 这个重要的环节。 • 相对于低级的I/O操作(即系统调用级的I/O),标 准I/O库函数处理了很多细节,如缓存分配等. • 考虑到代码的可移植性,开发人员应该在编写代 码时尽可能使用标准库函数。 • 头文件<stdio.h>中声明了标准C的I/O库,标准 C的I/O库在所有通用计算机上的C语言实现都 是相同的。
每次一行的I/O char *fgets(char *buf, int n, FILE *fp) char *gets(char *buf) int fputs(const char *str, FILE *fp) int puts(const char *str) fgets从fp指定的文件中最多读取n-1个字符放到buf所指向 的数组中.读到换行符或文件结束符后不再向后读,最后一 个字符读入后接着写入一个空字符。 fputs函数将字符串写入fp文件中,终止字符串的空字符不 写入。 ¾ gets()丢掉输入里的换行符,但puts()为输出添加换行 符。fgets()存储输入中的换行符,而fputs()不为输出添加 换行符.
• 库函数由两类函数组成 • 不需要操作硬件的直接由函数内部完成,并将 结果反馈给应用程序,如:strcpy等字符串操 作函数 • 需要操作硬件的,则通过封装系统调用实现相 应的功能,如:printf等 并不是所有的系统调用都被封装成了库函数,系 统提供的很多功能都必须通过系统调用才能实现
• 系统调用是需要时间的,程序中频繁的使用系统 调用会降低程序的运行效率 • 当运行内核代码时,CPU工作在系统态, 在系统 调用发生前需要保存用户态的栈和内存环境, 然后转入系统态工作 • 系统调用结束后,又要切换回用户态.这种环境 的切换会消耗掉许多时间 • 库函数访问文件时根据需要设置不同类型 的缓冲区,从而减少了直接调用IO系统调 用的次数,提高了访问效率
数据块I/O size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp) size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp) ¾ size是数据块大小,nobj指要读取或写入的数 据块个数,fp指定要操作的数据流。 ¾两个函数返回的是实际读或写的数据块的个 数,而不是整个数据的字节数。
文件流的检测 int feof(FILE *fp) int ferror(FILE *fp) ¾ feof函数判断文件是否处于文件结束位置,如 文件结束返回1,否则返回0. ¾ ferror函数检查文件在用各种输入输出函数进 行读写时是否出错.返回0表示没有错,否则有错
读和写流 一旦打开了流,则可以在三种不同类型的 非格式化I/O中进行选择,对其进行读写 操作: 1.每次一个字符的I/O 2.每次一行的I/O 3.数据块I/O
பைடு நூலகம்
每次一个字符的I/O int getc(FILE *fp) int fgetc(FILE *fp) int getchar(void) int putc(int c, FILE *fp) int fputc(int c, FILE *fp) int putchar(int c)
格式化输入 int scanf(const char *format,…) int fscanf(FILE *fp, const char *format,…) int sscanf(const char *buf, const char *format,…) scanf从键盘读入信息,fscanf从文件中 读入信息,sscanf的是从数组中读入信息.
定位流 long ftell(FILE *fp) 函数说明: ftell用来获取文件流目前的读写位置, 参数fp为已打开的文件指针。 返回值: 成功时返回目前的读写位置,若有错误 返回-1,errno会保存错误代码.
定位流 int fseek(FILE *fp, long offset,int whence) 函数说明: fseek函数是把当前位置设置到offset处,whence参 数决定了相对于文件的位置. whence可取三个值: SEEK_SET 相对于文件起始位置 SEEK_CUR 相对于文件当前位置 SEEK_END 相对于文件末尾位置 这三个值分别对应0,1,2,在/usr/include/stdio.h中定 义. 返回值: fseek调用成功返回0,出错返回-1,errno会存放错 误代码.
关闭流 头文件: #include<stdio.h> 定义函数: int fclose(FILE *stream); 函数说明: fclose用来关闭fopen打开的文件.此动作会让缓冲 区的数据写入文件中,并释放系统所提供的文件 资源. 返回值: 若文件动作成功则返回0,有错误发生时返回EOF
定位流 long ftell(FILE *fp) int fseek(FILE *fp, long offset, int whence) void rewind(FILE *fp) int fgetpos(FILE *fp, fpos_t *pos) int fsetpos(FILE *fp, fpos_t *pos)
• 对于标准I/O操作函数来说,打开或创建一 个 文件时,会返回一个指向FILE对象的指针. • ¾该FILE对象通常是一个结构体,它包含了 I/O函数库为管理该FILE对象所需要的尽 可能多的信息。 • ¾ FILE结构体,包括用于实际I/O文件的 文件 描述符,指向流缓存的指针,缓存长度等.
打开流 表头文件: #include<stdio.h> 定义函数: FILE* fopen(const char *path, const char *mode); 函数说明: 参数path字符串包含欲打开的文件路径及文件 名,参 数mode字符串代表着流形式. 返回值: 文件顺利打开后指向该流的文件指针就被返回.
系统调用与标准IO库
西藏大学工学院 武强
大纲
∗系统调用与标准I/O库的区别与联系 ∗常用标准I/O函数
系统调用与标准I/O库的区别与联系
∗ 在linux操作系统中,实现了两类对文件IO的管理: ∗ 一类由ANSI标准提供的标准IO库函数,几乎被所有的操作系统 支持,如winsdows下编写的程序,几乎不用做任何修改就可以 在linux下重新编译运行,如:fopen、fread、fwrite、fclose。 ∗ 一类遵循POSIX标准,以系统调用的方式给用户提供接口函数 如linux操作系统提供的文件IO接口,如open、write、read、close 等。 ∗ 系统调用与操作系统直接相关,直接使用系统调用编写 的程序的可移植性差
相关文档
最新文档