目录
1.进程打开文件的流程
2.先打开再fork的流程(重点)
1.代码演示
2.分析
3.先fork再open
1.代码演示
2.分析
4.fork补充:
5.系统调用与库函数的区别:
1.进程打开文件的流程
inode
节点
:
存放有关文件的属性信息
;(
唯一性
)
2.先打开再fork的流程(重点)
1.代码演示
![](https://img-blog.csdnimg.cn/4b784aa91f424e69acf7702416941e53.png)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
int fd=open("file.txt",O_RDONLY);
父进程中的文件描述符,fork以后,子进程也是可以访问的,而且父子进程共享文件偏移
量;(重点)
3.先fork再open代码演示及分析
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\n",buff);
sleep(1);
n=read(fd,buff,1);
printf("child %s\n",buff);
}
else
{
char buff[128]={0};
int n=read(fd,buff,1);
printf("parent %s\n",buff);
sleep(1);
n=read(fd,buff,1);
printf("parent %s\n",buff);
}
close(fd);
exit(0);
}
2.分析
先open在fork的流程
先创建一个文件
file.txt,
内容为
abcdefg;
父进程打开文件以后
,fork
产生子进程
,
父子进程共享打开的文件
,
同时共享文件偏移
量
;
父进程中的文件描述符
,fork
以后
,
子进程也是可以访问的
,
而且父子进程共享文件偏移
量
;(
重点
)
3.先fork再open
1.代码演示
(
了解文件偏移量不共享
)
![](https://img-blog.csdnimg.cn/271baa07c22b4206a5272bc5e896d0ea.png)
#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\n",buff);
sleep(1);
n=read(fd,buff,1);
printf("child %s\n",buff);
}
else
{
char buff[128]={0};
int n=read(fd,buff,1);
printf("parent %s\n",buff);
sleep(1);
n=read(fd,buff,1);
printf("parent %s\n",buff);
}
close(fd);
exit(0);
}
运行结果如下:
2.分析
![](https://img-blog.csdnimg.cn/9cb5d170ca3a4049afba69f3fd157a67.png)
先创建一个文件
file.txt,
内容为
abcdefg;
父进程打开文件以后
,fork
产生子进程
,
父子进程共享打开的文件
,
同时共享文件偏移
量
;
4.fork补充:
操作系统精髓与设计原理第101页:
UNIX中的进程创建是通过内核系统调用fork实现的。当一个进程产生一个 fork请求时,操作系统执行以下功能[BACH86]:
1)为新进程在进程表中分配一个空项。
2)为子进程赋一个唯一的进程标识符。
3)做一个父进程上下文的逻辑副本,不包括共享内存区。
4)增加父进程拥有的所有文件的计数器,以表示有一个另外的进程现在也拥有这些文件,
5)把子进程置为就绪态。
6)向父进程返回子进程的进程号;对子进程返回零。
所有这些操作都在父进程的内核态下完成。为当内核完成这些功能后可以继续下面三种操作之一,它们可以认为是分派器例程的一个部分:
●在父进程中继续执行。控制返回用户态下父进程进行fork调用处。
●处理器控制权交给子进程。子进程开始执行代码,执行点与父进程相同,也就是说在fork调用的返回处。
●控制转交给另一个进程。父进程和子进程都置于就绪状态。
很难想象这种创建进程的方法中父进程和子进程都执行相同的代码。其区别在于;当从fork中返回时,测试返回参数,如果值为零,则它是子进程,可以转移到相应的用户程序中继续执行;如果值不为零,则它是父进程,继续执行主程序。
5.系统调用与库函数的区别:
系统调用的执行过程
:
●
系统调用是为了方便使用操作系统的接口,
而库函数则是为了人们编程的方便
;
●
库函数调用与系统无关,
不同的系统
,
调用库函数
,
库函数会调用不同的底层函数实现
,
因
此可移植性好
;