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


    目录

    1.进程打开文件的流程

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

    1.代码演示

    2.分析

    3.先fork再open

    1.代码演示

    2.分析

    4.fork补充:

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


    1.进程打开文件的流程

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

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

    1.代码演示

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. int fd=open("file.txt",O_RDONLY);
    9. 父进程中的文件描述符,fork以后,子进程也是可以访问的,而且父子进程共享文件偏移
    10. 量;(重点)
    11. 3.先fork再open代码演示及分析
    12. assert(fd!=-1);
    13. pid_t pid=fork();
    14. assert(pid!=-1);
    15. if(pid==0)
    16. {
    17. char buff[128]={0};
    18. int n=read(fd,buff,1);
    19. printf("child %s\n",buff);
    20. sleep(1);
    21. n=read(fd,buff,1);
    22. printf("child %s\n",buff);
    23. }
    24. else
    25. {
    26. char buff[128]={0};
    27. int n=read(fd,buff,1);
    28. printf("parent %s\n",buff);
    29. sleep(1);
    30. n=read(fd,buff,1);
    31. printf("parent %s\n",buff);
    32. }
    33. close(fd);
    34. exit(0);
    35. }
    运行结果如下:

    2.分析

    先open在fork的流程

     
    先创建一个文件 file.txt, 内容为 abcdefg;
    父进程打开文件以后 ,fork 产生子进程 , 父子进程共享打开的文件 , 同时共享文件偏移
    ;
    父进程中的文件描述符 ,fork 以后 , 子进程也是可以访问的 , 而且父子进程共享文件偏移
    ;( 重点 )

    3.先forkopen

    1.代码演示

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

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. pid_t pid=fork();
    9. assert(pid!=-1);
    10. int fd=open("file.txt",O_RDONLY);
    11. assert(fd!=-1);
    12. if(pid==0)
    13. {
    14. char buff[128]={0};
    15. int n=read(fd,buff,1);
    16. printf("child %s\n",buff);
    17. sleep(1);
    18. n=read(fd,buff,1);
    19. printf("child %s\n",buff);
    20. }
    21. else
    22. {
    23. char buff[128]={0};
    24. int n=read(fd,buff,1);
    25. printf("parent %s\n",buff);
    26. sleep(1);
    27. n=read(fd,buff,1);
    28. printf("parent %s\n",buff);
    29. }
    30. close(fd);
    31. exit(0);
    32. }
    运行结果如下:

    2.分析

     

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

    4.fork补充:

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

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

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

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

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

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

    系统调用的执行过程 :

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

  • 相关阅读:
    python中的字节码对象初探
    课节2: 目标检测任务综述
    《痞子衡嵌入式半月刊》 第 40 期
    React入门
    推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
    Python py文件打包成 exe文件
    Java实现基于Socket的负载均衡代理服务器(含六种负载均衡算法)
    人工智能——图像处理和Python深度学习的全教程(建议收藏)
    Speedoffice有几种版本?适合什么系统使用呢?
    377. 组合总和 Ⅳ【完全背包】求排列数:外层for背包,内层for物品;求组合数:外层for物品,内层for背包;
  • 原文地址:https://blog.csdn.net/m0_59052131/article/details/127545770