系统调用
什么是系统调用:
由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。是应用程序同系统之间数据交互的桥梁。
C标准函数和系统函数调用关系。一个helloworld如何打印到屏幕。
回忆我们前面学过的C标准库文件IO函数。
fopen、fclose、fseek、fgets、fputs、fread、fwrite......
r 只读、 r+读写
w只写并截断为0、 w+读写并截断为0
a追加只写、 a+追加读写
系统函数
open 函数
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int close(int fd);
常用参数
O_RDONLY、O_WRONLY、O_RDWR
O_APPEND、 在文件末尾追加
O_CREAT、 创建文件
O_EXCL、
O_TRUNC、 清空
O_NONBLOCK
创建文件时,指定文件访问权限。权限同时受umask影响。结论为:
文件权限 = mode & ~umask
使用头文件:<fcntl.h>
open常见错误 :
1. 打开文件不存在
2. 以写方式打开只读文件(打开文件没有对应权限)
3. 以只写方式打开目录
返回值
返回一个 fd,是无符号整型,代表的是 文件描述符
如果有error,则返回-1
如果成功,返回对应该文件的fd,
正常 fd 是3开始的,因为0,1,2 被占用了。
文件描述符存在于 PCB 进程控制块中。PCB 进程控制块存在于
举例
#include <cstdio>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
#include <errno.h>
#include <string.h>
using namespace std;int main()
{int fd;//fd = open("/home/hunandede/projects/linuxcpp/dict.txt",O_RDONLY);fd = open("./c.txt", O_RDONLY);//打开当前可执行程序 同一级 目录下的 a.txt文件if (fd==-1) {cout << "can not find dict.txt fd = " << fd << " errno = " << errno << " strerror(errno) = " << strerror(errno) << endl;strerror(errno);}int fd2;fd2 = open("./b.txt", O_CREAT | O_RDWR, 0664);cout << "fd2 = " << fd2 << endl;if (fd2<0) {cout << "crate b.txt fail fd2 = " << fd2 << " errno = " << errno << endl;}printf("hello from linuxcpp!\n");return 0;
}
我们从open 函数引出的 文件描述符:的概念
PCB进程控制块 (进而引出的的概念)
read/write 函数
函数原型:
ssize_t read(int fd, void *buf, size_t count);
参数:
fd:文件描述符,从那个文件里面读取
buf:读到的数据放到哪里
count:缓冲区大小,(也就是说,读多少字节的数据)
ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符,给那个文件里面写
buf:将哪里的数据写入fd
count:将哪里的数据写入多少到fd
read与write函数原型类似。使用时需注意:read/write函数的第三个参数。