前言:
由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。系统调用就是应用程序同系统之间数据交互的桥梁。
一、open/close函数
1.open函数:
(1)int open(char *pathname, int flags) #include <unistd.h>
参数:
pathname: 欲打开的文件路径名
flags:文件打开方式: #include <fcntl.h>
O_RDONLY|O_WRONLY|O_RDWR O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK ....
返回值:
成功: 打开文件所得到对应的 文件描述符(整数)
失败: -1, 设置errno
(2)int open(char *pathname, int flags, mode_t mode) 123 775
参数:
pathname: 欲打开的文件路径名
flags:文件打开方式:
O_RDONLY|O_WRONLY|O_RDWR O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK ....
mode: 参数3使用的前提, 参2指定了 O_CREAT。
取值8进制数,用来描述文件的 访问权限。 rwx 0664
创建文件最终权限 = mode & ~umask
返回值:
成功: 打开文件所得到对应的 文件描述符(整数)
失败: -1, 设置errno
2.close函数:
int close(int fd);
3.错误处理函数:
与 errno 相关。
printf("xxx error: %d\n", errno);
char *strerror(int errnum);
printf("xxx error: %s\n", strerror(errno));
void perror(const char *s);
perror("open error");
二、read/write函数:
1.read函数:
ssize_t read(int fd, void *buf, size_t count);
参数:
fd: 文件描述符
buf: 存数据的缓冲区
count:缓冲区大小
返回值:
0: 读到文件末尾。
成功; > 0 读到的字节数。
失败: -1, 设置 errno
-1: 并且 errno = EAGIN 或 EWOULDBLOCK, 说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。
2.write函数:
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd: 文件描述符
buf: 待写出数据的缓冲区
count:数据大小
返回值:
成功; 写入的字节数。
失败: -1, 设置 errno
示例:
用read和write函数实现cp操作(将open.c文件中的代码复制到open2.c中)
1 #include <unistd.h>
2 #include <fcntl.h>
3 #include <stdlib.h>
4 #include <pthread.h>
5 #include <string.h>
6 #include <stdio.h>
7
8 int main(int argc,char *argv[])
9 {
10 char buf[1024];
11
12 int n = 0;
13
14 int fd1 = open(argv[1],O_RDONLY); //read
15 if(fd1 == -1){
16 perror("open argv1 error");
17 exit(1);
18 }
19
20 int fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664);
21 if(fd2 == -1){
22 perror("open argv2 error");
23 exit(1);
24 }
25 while((n = read(fd1,buf,1024))!=0){
26 if(n < 0)
27 {
28 perror("read error");
29 break;
30 }
31 write(fd2,buf,n);
32 }
33
34 close(fd1);
35 close(fd2);
36 }
~
三、系统调用和库函数比较
预读入缓输出