操作文件的系统调用
int open(const char* pathname, int flags);//用于打开一个已存在的文件
int open(const char* pathname, int flags,mode_t mode);//用于新建一个文件, 并设置访问权限
参数介绍:
pathname:将要打开的文件路径和名称
lags : 打开标志,如 O_WRONLY 只写打开
O_RDONLY 只读打开
O_RDWR 读写方式打开
O_CREAT 文件不存在则创建
O_APPEND 文件末尾追加
O_TRUNC 清空文件,重新写入
mode: 权限 如:“0600”
返回值:为文件描述符
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 存放待写入的数据
count 计划一次向文件中写多少数据
int close(int fd);
参数介绍:
fd 要关闭的文件描述符
思考:父进程先打开一个文件,fork 后子进程是否可以共享使用?
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <unistd.h>
4. #include <string.h>
5. #include <assert.h>
6. #include <fcntl.h>
7. //分析程序执行的打印结果
8. int main()
9. {
10. char buff[128] = {0};
11. //myfile.txt 自己创建,并写入内容为“abcdef”
12. int fd = open("myfile.txt",O_RDONLY);
13.
14. pid_t pid = fork();
15. assert( pid != -1 );
16.
17. if ( pid == 0 )
18. {
19. read(fd,buff,1);
20. printf("child buff=%s\n",buff);
21.
22. sleep(1);
23. read(fd,buff,1);
24. printf("child buff=%s\n",buff);
25. }
26. else
27. {
28. read(fd,buff,1);
29. printf("parent buff=%s\n",buff);
30.
31. sleep(1);
32. read(fd,buff,1);
33. printf("parent buff=%s\n",buff);
34. }
35.
36. close(fd);
37. }
由于 fork 创建的子进程的 PCB 是拷贝父进程的,子进程的 PCB 中的文件表指向打开文 件的指针只是拷贝了父进程 PCB 中的值,所以父子进程会共享父进程 fork 之前打开的所有 文件描述符。如下图所示: