系统调用和标准库函数
来源:互联网 发布:数据库安全性设计 编辑:程序博客网 时间:2024/05/21 23:33
一.系统调用
1.所谓系统调用是指操作系统提供给用户的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的的服务。
2.为什么用户程序不能直接访问系统内核提供的服务?
由于在Linux中,为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此,用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。
3.Linux一点哲学,“一切皆为文件”;在Linux中对目录和设备的操作都等同于对文件的操作,都是使用文件描述符来进行的。
4.创建文件
格式:int creat(const char *filename, mode_t mode )
参数:filename:创建文件的文件名;
mode: 创建模式,常用的S_IRWXU和S_IRWXG
例程序:创建一个名为test。txt的文件,属性为用户和用户同组的可读可写可执行。
#include<stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include<stdlib.h>int main(){int ret;ret=creat("test.txt",S_IRWXU|S_IRWXG);if(ret==-1){perror("creat");exit(1);}return 0;}
5.打开文件
格式:int open(const char *pathname, int flags, mode_t mode);
参数:flage:O_RDONLY, O_WRONLY, or O_RDWR.
O_CREAT, O_EXCL, O_NOCTTY, and O_TRUNC.
O_CREAT文件不存在时就创建,多与O_EXCL连用如文
件存在就会报错。
例程序:
#include<stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include<stdlib.h>#include <sys/types.h>struct node{ int date; char name[20];};typedef struct node Node;int main(){ Node stu={2,"tao"}; Node tem; int fd; fd=open("struct.txt", O_RDWR| O_CREAT,S_IRWXU|S_IRWXG); if(-1==fd) { perror("open"); exit(1); } int fd1; fd1=write(fd,&stu,sizeof(Node)); if(-1==fd1) { perror("write"); exit(1); } fd1=lseek(fd,0,SEEK_SET); if(-1 == fd1) { perror("lseek"); exit(1); } fd1=read(fd,&tem,sizeof(Node)); if(-1 == fd1) { perror("read"); exit(1); } printf("%d %s\n",tem.date,tem.name); close(fd); return 0;}
二.标准库函数
1.标准库函数是带缓存区的。
标准I/O提供缓存的目的就是减少调用read和write的次数,它对每个I/O流自动进行缓存管理(标准I/O函数通常调用malloc来分配缓存)。
它提供了三种类型的缓存: 1) 全缓存。当填满标准I/O缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。 2) 行缓存。当输入输出遇到新行符或缓存满时,才由标准I/O库执行实际I/O操作。stdin、stdout通常是行缓存的。 3) 无缓存。相当于read、write了。stderr通常是无缓存的,因为它必须尽快输出。
2.FILE *fopen(const char *filename, const char *mode)
filename:打开的文件名(包含路径,缺省为当前路径)
mode: 打开模式
r, rb : 只读方式打开,文件必须已存在
w,wb : 只写方式打开,如果文件不存在则创建,
如果文 件已存在清空重写
a, ab: 只能在文件末尾追加数据,如果文件不存在则创建
r+,rb+,r+b: 读写方式打开,文件必须已存在
w+,w+b,wb+: 读写方式打开,如果文件不存在则
创建,如果文件已存在清空重写
a+,a+b,ab+: 读和追加方式打开,如果文件不存在则创建
3.int fgetc(FILE * stream);
函数说明:
fgetc()从参数stream所指的文件中读取一个字符。
若读到文件尾而无数据时便返回EOF。
返回值:
fgetc()会返回读取到的字符,
若返回EOF则表示到了文件尾。
4.size_t fread(void * ptr,size_t size,
size_t nmemb, FILE * stream)
函数说明: fread()用来从文件流中读取数据。
参数:stream为已打开的文件指针,
ptr: 指向欲存放读取进来的数据空间,
读取的字符数以参数size*nmemb来决定。
返回值:
返回实际读取到的nmemb数目。
5.size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream)
函数说明:fwrite()用来将数据写入文件流中。
参数:
stream:为已打开的文件指针,
ptr: 指向欲写入的数据地址,总共写入的字符数以 参数size*nmemb来决定。
返回值:
返回实际写入的nmemb数目。
例程:实现自己的cat命令函数
#include<stdio.h>#include<stdlib.h>#include<string.h>int main(int argv,char *argc[]){ FILE *fp1; fp1=fopen(argc[1],"r"); char buf[50]={0}; int ret; if(NULL == fp1) { perror("fopen1"); exit(1); } while((ret=fread(buf,1,sizeof(buf)-1,fp1))!=0) { printf("%s",buf); memset(buf,0,sizeof(buf)); }}
- 系统调用和标准库函数
- 标准库函数和系统调用的区别
- 标准库函数和系统调用的区别
- 标准库函数和系统调用的区别
- 系统调用read,write和标准库函数IO
- 系统调用read,write和标准库函数IO
- 系统调用和库函数
- 库函数和系统调用
- 系统调用和库函数
- 库函数和系统调用
- 库函数和系统调用
- 系统调用和库函数
- 系统调用和库函数
- 系统调用和库函数
- 系统调用和库函数
- 库函数和系统调用
- 库函数和系统调用
- 库函数调用和系统调用
- php参数优化
- 如何在Oracle数据库中使用dbms_output输出内容
- Android逆向之将apk还原成源码工程项目
- 用bootstrap遇到的问题
- Oracle将数据导出到CSV文件
- 系统调用和标准库函数
- STM8L USART串口调试
- 快速理解树的递归遍历方式
- Capstone训练营2017-12-6
- Exception
- Scala语言双重for循环实现打印九九乘法表
- 在SSM框架中出现Field error in object 'xxx' on field 'XXX': rejected value [];错误
- [RCA][2017-12-06] Django后台通过API返回CSS
- web前端项目同时集成JSP和FreeMaker___多视图解析器配置