Linux进程打开文件(先open再fork、先fork再open)
1、进程打开文件的流程
inode节点:存放有关文件的属性信息;(唯一性)
2、先open再fork的流程(重点)
代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <fcntl.h> int main() { int fd=open("file.txt",O_RDONLY); assert(fd!=-1); pid_t pid=fork(); assert(pid!=-1); if(pid==0) { char buff[128]={0}; int n=read(fd,buff,1); printf("child %s ",buff); sleep(1); n=read(fd,buff,1); printf("child %s ",buff); } else { char buff[128]={0}; int n=read(fd,buff,1); printf("parent %s ",buff); sleep(1); n=read(fd,buff,1); printf("parent %s ",buff); } close(fd); exit(0); }
先创建一个文件file.txt,内容为abcdefg;
父进程打开文件以后,fork产生子进程,子进程也是可以访问的,父子进程共享打开的文件,同时共享文件偏移量;
3、先fork再open
(了解文件偏移量不共享)
代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <fcntl.h> int main() { pid_t pid=fork(); assert(pid!=-1); int fd=open("file.txt",O_RDONLY); assert(fd!=-1); if(pid==0) { char buff[128]={0}; int n=read(fd,buff,1); printf("child %s ",buff); sleep(1); n=read(fd,buff,1); printf("child %s ",buff); } else { char buff[128]={0}; int n=read(fd,buff,1); printf("parent %s ",buff); sleep(1); n=read(fd,buff,1); printf("parent %s ",buff); } close(fd); exit(0); }
4、系统调用与库函数的区别:
系统调用的执行过程:
系统调用是为了方便使用操作系统的接口,而库函数则是为了人们编程的方便;
库函数调用与系统无关,不同的系统,调用库函数,库函数会调用不同的底层函数实现,因此可移植性好;