系统调用及用户编程接口(API)
系统调用:用户通过操作系统提供的接口(API)获得内核提供的一些服务程序的运行空间逻辑上是分离的,分为内核空间和用户空间。用户进程通常情况下无法访问内核空间。所有的进程会在内核中有一个文件记录表,记录表是有限的。文件描述符是一个非负整数,是一个索引值,指向内核空间每个进程的记录表Linux一点哲学,一切皆为文件(包括输入输出设备);故标准输入STDIN_FILENO
·
系统调用:用户通过操作系统提供的接口(API)获得内核提供的一些服务
程序的运行空间逻辑上是分离的,分为内核空间和用户空间。
用户进程通常情况下无法访问内核空间。
所有的进程会在内核中有一个文件记录表,记录表是有限的。
文件描述符是一个非负整数,是一个索引值,指向内核空间每个进程的记录表
Linux一点哲学,一切皆为文件(包括输入输出设备);
故标准输入STDIN_FILENO 0
STDOUT_FILENO 1
STDERR_FILENO 2
常用系统调用函数
int creat(const char *filename,mode_t mode)
filename:创建的文件名称(包含路径,缺省为当前路径)
mode:创建模式,
读 S_IRUSR S_IRGRP S_IROTH
写 S_IWUSR S_IWGRP S_IWOTH
执行 S_IXUSR S_IXGRP S_IXOTH
或者用数字:0644 0为8进制 1 读 2 写 3 4执行
int open (const char* pathname, int flag,mode_t mode)
open函数,pathname为文件名,flag 为打开方式(整型变量)
flag: O_CREAT |O_EXCL 不存在即创建,存在即报错
O_NONBLOCK 非阻塞方式打开(例如使用read函数读取空文件时,阻塞方式是等到对空白文件输入时才会返回)
O_TRUNC 把打开的文件长度截断为零 (清空)
O_RDONLY O_WRONLY O_RDWR O_APPEND 以只读/只写/读写/追加(写方式,并定位到文件末尾开始写)打开
与open函数成对出现的是close函数,文件打开后若不关闭,文件一直处于打开的状态
int close (int fd) 成功关闭返回零,否则返回-1出错
int read (int fd, const void *buf, size_t length)
从fd 指向的文件中读出length长度的字符到buf中(缓冲区),返回值为实际读取的字节数,
遇到文件结束符EOF,返回零(会出现部分读问题)
int write (int fd, const void *buf, size_t length)
与read类似,也会出现部分写问题,需要注意
定位函数
int lseek (int fd, offset_t offset, int whence)
将文件读写指针相对whence移动offset个字节,返回文件指针相对于文件头的位置
whence :SEEK_SET 文件开头 SEEK_SUR 相对文件读写指针的当前位置
SEEK_END 文件尾
offset可为负值,表示向前移动。(可通过lseek函数计算文件长度)
补充:memset函数
memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为:
void *memset(void*,int,unsigned);
其中void*表示地址 memset()的第一个实参是数组名,数组名作参数即数组作参数,它仅仅只是一个数组的起始地址而已。
在函数memset()栈区,从返回地址往上依次为第1,2,3个参数。第1个参数中的内容是main()函数中定义的数组ia1的起始地址。第2个参数是给数组设置的值(0),第3个参数是数组的长度(50*2)。函数返回时,main()函数的数组中内容全置为0。
系统调用与API的区别
在
linux
中,将
程序
的运行空间分为内核与
用户空间
(内核态和用户态),在逻辑上它们之间是相互隔离的,因此
用户程序
不能访问内核数据,也无法使用内核
函数
。
具体步骤:用户进程-->
系统调用
-->内核-->返回用户空间。
系统调用就是为了解决上述问题而引入的,是提供给用户的“特殊接口”。
系统调用规定用户进程进入
内核空间
的具体位置。
1.程序运行空间从用户空间进入内核空间。
2.处理完后再返回
用户空间
。
3.什么是API
答:api 就是
应用程序
接口,是一些预定义的函数。跟内核没有必然的联系。API(Application Programming Interface)应用程序接口,是一些预先定义的函数,提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
4.两者的区别。
答:区别:api是函数的定义,规定了这个函数的功能,跟内核无直接关系。而系统调用是通过
中断
向内核发请求,实现内核提供的某些服务。
联系:一个api可能会需要一个或多个系统调用来完成特定功能。通俗点说就是如果这个api需要跟内核打交道就需要系统调用,否则不需要。
程序员
调用的是API(
API函数
),然后通过与系统调用共同完成函数的功能。
因此,API是一个提供给
应用程序
的接口,一组函数,是与
程序员
进行直接交互的。
系统调用则不与
程序
员进行交互的,它根据API函数,通过一个软
中断
机制向内核提交请求,以获取内核服务的接口。
并不是所有的API函数都一一对应一个系统调用,有时,一个API函数会需要几个系统调用来共同完成函数的功能,甚至还有一些
API函数
不需要调用相应的
系统调用
(因此它所完成的不是内核提供的服务)
更多推荐
已为社区贡献1条内容
所有评论(0)