Linux--文件、进程、fork、open、系统调用、库函数相关知识

目录

1.进程打开文件的流程

2.先打开再fork的流程(重点)

1.代码演示

2.分析

3.先fork再open

1.代码演示

2.分析

4.fork补充:

5.系统调用与库函数的区别:


1.进程打开文件的流程

inode 节点 : 存放有关文件的属性信息 ;( 唯一性 )

2.先打开再fork的流程(重点)

1.代码演示

#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.先forkopen

1.代码演示

( 了解文件偏移量不共享 )

#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.分析

 

先创建一个文件 file.txt, 内容为 abcdefg;
父进程打开文件以后 ,fork 产生子进程 , 父子进程共享打开的文件 , 同时共享文件偏移
;

4.fork补充:

操作系统精髓与设计原理第101页:

UNIX中的进程创建是通过内核系统调用fork实现的。当一个进程产生一个 fork请求时,操作系统执行以下功能[BACH86]:
1)为新进程在进程表中分配一个空项。

2)为子进程赋一个唯一的进程标识符。
3)做一个父进程上下文的逻辑副本,不包括共享内存区。
4)增加父进程拥有的所有文件的计数器,以表示有一个另外的进程现在也拥有这些文件,

5)把子进程置为就绪态。
6)向父进程返回子进程的进程号;对子进程返回零。
所有这些操作都在父进程的内核态下完成。为当内核完成这些功能后可以继续下面三种操作之一,它们可以认为是分派器例程的一个部分:

●在父进程中继续执行。控制返回用户态下父进程进行fork调用处。
●处理器控制权交给子进程。子进程开始执行代码,执行点与父进程相同,也就是说在fork调用的返回处。
●控制转交给另一个进程。父进程和子进程都置于就绪状态。
很难想象这种创建进程的方法中父进程和子进程都执行相同的代码。其区别在于;当从fork中返回时,测试返回参数,如果值为零,则它是子进程,可以转移到相应的用户程序中继续执行;如果值不为零,则它是父进程,继续执行主程序。

5.系统调用与库函数的区别:

系统调用的执行过程 :

系统调用是为了方便使用操作系统的接口, 而库函数则是为了人们编程的方便 ;
库函数调用与系统无关, 不同的系统 , 调用库函数 , 库函数会调用不同的底层函数实现 ,
此可移植性好 ;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值