系统调用和标准库函数

来源:互联网 发布:数据库安全性设计 编辑:程序博客网 时间: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));   }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2个月婴儿脸皴了怎么办 掉头发怎么办怎样能让头发变多 11个月的宝宝大便干燥怎么办 1岁宝宝又拉又吐怎么办 怀孕八个月了不想要了怎么办 奶水不够宝宝又不喝奶粉怎么办 手机恢复出厂设置密码忘了怎么办 5s锁屏密码忘了怎么办 深圳房子卖了户口没地方迁怎么办 宝马1系130i烧机怎么办 小孩流清鼻涕怎么办最简单方法 孕3个月胎盘低置怎么办 孩子判逆不听家长的话该怎么办 香港购物超5000被海关扣怎么办 浅色衣服被深色衣服染色了怎么办 金立手机微信不能发语音怎么办 吃鸡买的账号密码邮箱忘记了怎么办 氩弧焊枪管带里进水了怎么办 绝地求生穿头盔的时候连衣帽怎么办 开车不小心把光缆线给挂断了怎么办 脚刺到了生锈钢钉没打针怎么办 一加3t背壳螺丝掉了怎么办 30万美金美金中国被扣怎么办 电脑使用迅雷变的很卡怎么办 优盘拷贝过程中失去优盘路径怎么办 用百度云上传视频文件太慢了怎么办 网易云音乐云盘电脑上传很慢怎么办 路由器的宽带账号密码忘记了怎么办 蚂蚁邦路由器管理密码忘记了怎么办 红米2a刷机失败怎么办 小米手机开机图案锁忘记了怎么办 小米6进水无限闪屏开机重启怎么办 红米手机一直卡在开机画面怎么办 红米4卡在开机画面怎么办 红米手机一直在开机画面怎么办 红米手机一直跳开机画面怎么办 红米note3锁屏密码忘记怎么办 红米手机忘记锁屏密码怎么办 红米4锁屏密码忘了怎么办 红米note忘记锁屏密码怎么办 红米note2锁屏密码忘了怎么办