文件操作:
底层系统调用:
所需头文件:
#include<fcntl.h>
int open(文件路径(const char *),打开方式(只读,只写,读写,创建),文件权限):
其中打开方式:
只读:O_RDONLY
只写:O_WRONLY
读写:O_RDWR
创建:O_CREAT
文件权限:
当要打开的文件不存在时,才会写第三个参数,0600(读写权限)
返回值:
返回值为文件描述符(int)
int read(文件描述符(int),要读到写入的空间(void *),读取个数(int)):
返回值:
返回值为实际读到的字节个数
int write(文件描述符(int),要照着写入文件描述符文件的空间(void *),要写入的个数(int)):
int close(文件描述符(int)):
示例1:
先创建file.txt并写入hello
再从file.txt中读取数据:
运行结果(打印read返回值,并打印读取内容)
示例2:
将一个图片读取并重新写为另一个图片(112.jpg读取并写入200.jpg)
运行结果:
fork与文件操作:
以文件file.txt为例:文件内容为abcdefgh
当我们先打开文件再fork:
运行结果:
我们可以看到子进程是在父进程后面跟着打印,说明父子进程共用一个文件偏移量。
结论:
当我们先fork再打开文件
运行结果:
这时我们可以看到父子进程打印的东西一样,说明他们各自有各自的文件偏移量。
结论:
系统调用与库函数的区别:
系统调用的实现在系统内核中,属于内核空间。库函数的实现在函数库中,属于用户态。