系统编程 笔记1

系统调用(内核提供的函数) ;

open函数的真正系统调用函数 sys_open;

read函数的真正系统调用函数 sys_read;所以真正open read函数严谨的来说不叫系统调用叫系统函数,sys_read sys_open是系统调用,两种基本没区别,就是换了一个壳;

内核里头主要是驱动最后会对应到硬件的各个部件 ;

如:printf(“hello”);需要打印到显示屏上需要通过系统调用进入内核,再通过内核的各个驱动(显卡驱动),将hello打印到公屏;

1.open函数:

头文件:#include<unistd.h>//unix标准头文件

int open(const char *pathname, int flags);//(目标文件的路径,打开方式:O_RDONLY, O_WRONLY, O_RDWR,O_CREAT, O_EXCL(判断是否存在),O_NOCTTY, and O_TRUNC(清零))这几个参数的宏在#include<fcntl.h>里file control;

int open(const char *pathname, int flags,mode_t mode);//多了个权限,如:0644 rw-r–r– 第一个零表示8进制

这个会受到umask的影响,比如输入指令umask系统给一个0002,那么当 mode = 0777时,最后生成的文件属性为0775

公式为:文件权限 = mode & ~umask;

errno 在 #include<errno.h>//常见的有0,2

strerrno 在#include<string.h>//描述errno代表的意思

通过man可知,flags参数的取值有三个 (manpage可以看20篇,英文不懂就查)

2.read write函数:

ssize_t read(int fd, void *buf, size_t count);

ssize_t一个有符号的数

fd:文件描述符

buf:存数据的缓冲区

count:缓冲区的大小

返回值:

0 : 读到了文件的末尾(可用作while循环的条件)

成功: 读到的字节数

失败: – 1 设置errno

-1:并且 errno = EAGIN 或 EWOULDBLOCK 不是read失败而是read以非阻塞方式在读一个设备文件或者网络文件,并且文件无数据。

ssize_t write(int fd, const void *buf, size_t count);

参数:

fd:文件描述符

buf:代写出数据 的缓冲区

count:数据大小

返回值:

成功:写入的字节数

失败:- 1 并设置errno

perror(“这里写出错时给自己的提示”);如open函数只读打开一个不存在的文件,这里写perror(“open error”);提示自己错误在这里,是open出了差错。

strerror(errno);翻译errno给的数是什么意思,在string.h中

库函数是不能进内核空间的,不能进就无法操作内核里的设备驱动无法达到交互的效果,所以用库函数最终还是回调用系统函数来进入内核空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值