系统调用——open、write、read和close
2017-11-13 17:20
1346 查看
一、文件描述符
每一个进程都有一个与之相关的文件描述符,它们是一些小值整数,我们可以通过这些文件描述符来访问打开的文件。
一般地,一个程序开始运行时,会自动打开3个文件描述符:
0——–标准输入———-stdin
1——–标准输出———-stdout
2——–标准错误———-stderr
二、write系统调用
1.write系统调用的原型:
write系统调用,是把缓存区buf中的前nbytes字节写入到与文件描述符flides有关的文件中,write系统调用返回的是实际写入到文件中的字节数。
2.举例,将一串字符写入到标准输入、输出里
在Linux上的执行结果:
三、read系统调用
read系统调用的原型:
read系统调用,是从与文件描述符flides相关联的文件中读取前nbytes字节的内容,并且写入到数据区buf中。read系统调用返回的是实际读入的字节数
运行结果:
四、open系统调用
在上面的write和read中,我们使用的文件描述符是自程序运行就有了的3个文件描述符,那么接下来open就可以创建新的文件描述符,供write和read来使用。
open系统调用的原型:
open有两种调用方法:
1.
将准备打开的文件或是设备的名字作为参数path传给函数,oflags用来指定文件访问模式。open系统调用成功返回一个新的文件描述符,失败返回-1。
其中,oflags是由必需文件访问模式和可选模式一起构成的(通过按位或“|”):
必需部分:
O_RDONLY———-以只读方式打开
O_WRONLY———以只写方式打开
O_RDWR————以读写方式打开
可选部分:
O_CREAT————按照参数mode给出的访问模式创建文件
O_EXCL————–与O_CREAT一起使用,确保创建出文件,避免两个程序同时创建同一个文件,如文件存在则open调用失败
O_APPEND———-把写入数据追加在文件的末尾
O_TRUNC———–把文件长度设置为0,丢弃原有内容
将一个现有文件的内容拷贝到新文件中,新文件已存在
2.
4000
[/code]
在第一种调用方式上,加上了第三个参数mode,主要是搭配O_CREAT使用,同样地,这个参数规定了属主、同组和其他人对文件的文件操作权限。
S_IRUSR———-读权限 )
S_IWUSR———写权限 ——文件属主
S_IXUSR———-执行权限 )
S_IRGRP———-读权限 )
S_IWGRP———写权限 ——文件所属组
S_IXGRP———-执行权限 )
S_IROTH———-读权限 )
S_IWOTH———写权限——其他人
S_IXOTH———-执行权限 )
另外,也可以用文字设定法:
0——————无权限
1——————只执行
2——————只写
4——————只读
将一个现有文件的内容拷贝到新文件中,新文件需自行创建
两个文件的内容:
五、close系统调用
终止文件描述符flides与其对应的文件间的联系,文件描述符被释放,可重新使用。
1.close系统调用
使用完文件描述符之后,要记得释放!
每一个进程都有一个与之相关的文件描述符,它们是一些小值整数,我们可以通过这些文件描述符来访问打开的文件。
一般地,一个程序开始运行时,会自动打开3个文件描述符:
0——–标准输入———-stdin
1——–标准输出———-stdout
2——–标准错误———-stderr
二、write系统调用
1.write系统调用的原型:
#include <unistd.h> size_t write(int flides, const void *buf, size_t nbytes);
write系统调用,是把缓存区buf中的前nbytes字节写入到与文件描述符flides有关的文件中,write系统调用返回的是实际写入到文件中的字节数。
2.举例,将一串字符写入到标准输入、输出里
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int real_num = write(1,"here is my word\t",17); if(real_num!=16)//没有错误,只是为了方便查看写成16 { write(1,some error); //write(0,some error) //如果写入到标准输入里,程序结束时会自动将标准输入里的内容输出 } exit(0); }
在Linux上的执行结果:
三、read系统调用
read系统调用的原型:
#include <unistd.h> size_t read(int flides, void *buf, size_t nbytes);
read系统调用,是从与文件描述符flides相关联的文件中读取前nbytes字节的内容,并且写入到数据区buf中。read系统调用返回的是实际读入的字节数
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { char buf[128] = {0}; int real_num; real_num = read(0,buf,128); if(real_num==-1)//读取失败 { write(2,"a error happened\n",17); } else { write(1,"succuss",7); } exit(0); }
运行结果:
四、open系统调用
在上面的write和read中,我们使用的文件描述符是自程序运行就有了的3个文件描述符,那么接下来open就可以创建新的文件描述符,供write和read来使用。
open系统调用的原型:
#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int main() { int open(const *path, int oflags);//1 int open(const *path, int oflags, mode_t mode);//2 exit(0); }
open有两种调用方法:
1.
int open(const *path, int oflags);
将准备打开的文件或是设备的名字作为参数path传给函数,oflags用来指定文件访问模式。open系统调用成功返回一个新的文件描述符,失败返回-1。
其中,oflags是由必需文件访问模式和可选模式一起构成的(通过按位或“|”):
必需部分:
O_RDONLY———-以只读方式打开
O_WRONLY———以只写方式打开
O_RDWR————以读写方式打开
可选部分:
O_CREAT————按照参数mode给出的访问模式创建文件
O_EXCL————–与O_CREAT一起使用,确保创建出文件,避免两个程序同时创建同一个文件,如文件存在则open调用失败
O_APPEND———-把写入数据追加在文件的末尾
O_TRUNC———–把文件长度设置为0,丢弃原有内容
将一个现有文件的内容拷贝到新文件中,新文件已存在
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { char buff[128] = {0}; int out = open("file.c",O_RDONLY);//以只读方式打开文件 int in = open("text.c",O_WRONLY);//以只写方式打开另外一个文件 int real_num_read = read(out, buff, 128); while(real_num_read)//读到即写入 { write(in, buff, 128);//写入的字节数为实际读到的个数 } close(out); close(in); exit(0); }
2.
int open(const *path, int oflags, mode_t mode);
4000
[/code]
在第一种调用方式上,加上了第三个参数mode,主要是搭配O_CREAT使用,同样地,这个参数规定了属主、同组和其他人对文件的文件操作权限。
S_IRUSR———-读权限 )
S_IWUSR———写权限 ——文件属主
S_IXUSR———-执行权限 )
S_IRGRP———-读权限 )
S_IWGRP———写权限 ——文件所属组
S_IXGRP———-执行权限 )
S_IROTH———-读权限 )
S_IWOTH———写权限——其他人
S_IXOTH———-执行权限 )
另外,也可以用文字设定法:
0——————无权限
1——————只执行
2——————只写
4——————只读
将一个现有文件的内容拷贝到新文件中,新文件需自行创建
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> int main() { int fr = open("./text_open_file.txt", O_RDONLY); assert(fr!=-1); int real_num; char buf[128] = {0}; real_num = read(fr,buff,127); int fw = open("./file.txt",O_WRONLY | O_CREAT, 0600); assert(fw!=-1); while(real_num) { write(fw,buff,127); real_num = read(fr,buff,127); } close(fw); close(fr); exit(0); }
两个文件的内容:
五、close系统调用
终止文件描述符flides与其对应的文件间的联系,文件描述符被释放,可重新使用。
1.close系统调用
#include <unistd.h> int close(int flides);
使用完文件描述符之后,要记得释放!
相关文章推荐
- Linux系统调用及用户编程接口(API) open close write read lseek
- 了解open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体
- 【Linux&Unix--open/close/write/read系统调用】
- Linux&Unix--open/close/write/read系统调用】
- 文件相关系统调用 open/read/write/close
- 【Linux&Unix--open/close/write/read系统调用】
- Nachos-3.4 系统调用 实现Create Open Read Write Close
- 简介几种系统调用函数:write、read、open、close、ioctl
- open,lseek,read,write,close系统调用《unix环境高级编程读书笔记》(1)
- 【Linux&Unix--open/close/write/read系统调用】
- Open、Read、Write、Lseek、Close、Create、Delete、chdir系统调用
- open/read/write/close等文件系统调用接口以及fd与FILE的比较
- 关于系统调用open,write,read,close及库函数fopen,fwrite,fread,fclose的使用
- 应用层open(read、write、close)如何调用驱动open(read、write、close)函数的?
- 应用层open(read、write、close)怎样调用驱动open(read、write、close)函数的?
- 四种读写文件的方式:系统调用(open/read/write),C语言(fopen,fgets, fputs),C++(ifstream, ofstream getline,)泛型算法
- 文件编程中的两套操作:标准C库(fread, fwrite,fclose,fopen...)和 系统调用(open, read, write...)
- C程序设计语言- UNIX系统接口-7.1----文件描述符、低级IO(read、write)、随机访问、(open、creat、close、unlink)
- Linux 文件系统调用函数open close read write lseek perror
- Linux系统开发 2 文件IO open() close() read() write() perror() lseek() fcntl() ioctl()