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

2023-10-26

目录

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.系统调用与库函数的区别:

系统调用的执行过程 :

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 我是女生,想进入IT行业难吗?

    女生进入IT职业真的不难 我从事IT职业6年多 身边有许多女同事 她们工资都非常高 她们中有程序员 测验人员 有技能支持人员 有产品司理 有项目司理 有UI规划师等等 她们有的是计算机专业结业的 也有非计算机专业结业的 虽然她们起点的确不太
  • fatal: Not a valid object name: ‘master‘.

    Git创建分支错误 Administrator DESKTOP RL96PC3 MINGW64 e dd master git branch devfatal Not a valid object name master 原因 是因为我们刚
  • 模板方法模式(模板方法设计模式)与回调机制解析

    模板方法是什么 模板方法模式在一个方法中定义一个算法的骨架 将某些步骤推迟到子类中实现 模板方法模式可以让子类在不改变算法整体的结构情况下 重新定义算法中的某些步骤 public abstract class AbstractClass p
  • 图的基础定义

    连通分量 相互可达的结点称为一个连通分量 割顶 删除某个点后 使图不再联通 桥 删除某个边后 使图不再联通 双连通 任意两点之间至少存在两条 点不重复 的路径 此时内部无割顶 双连通分量 点 双连通的一个极大子图 BCC 边 双连通分量 边
  • SDMG-R模型学习笔记

    商汤出的算法 用于关键信息提取 KIE 集成在mmocr包里 需要搭配mmcv一起使用 本文将结合论文 源码对模型结构进行一个梳理 题外话 mmcv用了hook编程 调试起来还是蛮难的 以后有空再分享下mmcv的框架逻辑 模型结构 整体结构
  • jira数据迁移过程

    jira数据迁移是常见的软件开发过程中遇到的问题 在数据迁移过程中下面讲解简单的过程 1 配置好jdk 2 配置好mysql数据库 3 配置好jira 4 在mysql中创建一个数据库 必须在创建时设置好数据库的字符集 为这个数据库创建一个
  • web前端入门到实战:CSS3 filter(滤镜)属性

    css3的滤镜filter属性 可以对网页中的图片进行类似Photoshop图片处理的效果 例如背景的毛玻璃效果 老照片 黑白照片 火焰效果等 一 blur px 高斯模糊 二 brightness 亮度 三 contrast 对比度 四
  • 通过Visio软件的宏编写Java代码

    1 新建Visio文件并打开 2 在 开发工具 选项卡上 单击 录制宏 3 操作Visio 如画图 画线等 4 点击停止录制 5 点击宏 6 可以查看到VB窗口的代码 可以一步步调试 根据宏代码尝试编写Java代码 一般情况下 宏中使用的代
  • 阿里面试题:为什么Map桶中个数超过8才转为红黑树

    这是一个好友面试阿里时 被问到的一个问题 应该不少人看到这个问题都会一面懵逼 因为 大部分的文章都是分析链表是怎么转换成红黑树的 但是并没有说明为什么当链表长度为8的时候才做转换动作 第一反应也是一样 只能初略的猜测是因为时间和空间的权衡
  • CloudQuery:更好地管理你的 OceanBase 数据库

    前言 作为 OceanBase 的生态合作伙伴 CloudQuery 简称 CQ 最新发布的社区版 2 2 0 新增了 OceanBase 数据库 为企业使用 OceanBase 数据库提供全面的支持 包括连接与认证 查询与分析 数据安全与
  • 软件测试开发和软件测试有什么区别?

    软件测试 软件测试是在测试中识别软件产品和 服务的准确性和质量的过程 显然 它的诞生是为了验证产品是否满足客户的特定先决条件和需求 在一天的工作结束前 确定特定的较终目标并测试执行一个框架或应用程序 以指出其错误 或缺陷 测试的职责是找到b
  • 颜色值透明度的百分数对应十六进制表

    目录 颜色简介 1 透明度的计算 2 透明度和不透明度的转换 3 透明度对应的十六进制值 4 不透明度对应的十六进制值 颜色简介 Android中的颜色值通常遵循RGB ARGB标准 使用时通常以 字符开头 以16进制表示 常用的颜色值格式
  • UDP协议详解

    文章目录 UDP概述 UDP主要特点 TCP和UDP区别 应用 适用场合 实际应用 代码演示 总结 UDP概述 UDP 是User Datagram Protocol的简称 中文名是用户数据报协议 是OSI Open System Inte
  • windows11文件夹共享设置 如何共享 如何访问

    一 确保文件夹共享相关服务处于启动状态 按快捷键Windows R 输入services msc 回车打开服务 确保以下服务都开启 需要全部开启后才能保证共享正常 1 DNS Client DNS 客户端服务 dnscache 缓存域名系统
  • 使用pip install -r requirements安装库出现的问题

    1 问题描述 ERROR No matching distribution found for matplotlib gt 3 2 2 WARNING There was an error checking the latest versi
  • redis五大数据类型+redis6 新类型(详解+指令)

    redis有五大数据类型分别是 1 String 字符串 2 List 列表 3 Set 集合 4 Hash 哈希 5 Zset 有序集合sorted set redis6 三种新数据类型 1 Bitmaps 实现对位的操作 以位为单位的数
  • SpringBoot配置postgre多数据源(亲测有效!!!)

    参考 https blog csdn net weixin 43240792 article details 106571925 稍微有一些不一样 pom引用
  • 蓝桥杯 试题 算法训练 最小距离 ( C++ )

    最小距离 最小距离 算法题目 算法代码 算法的核心思路 最小距离 算法题目 资源限制 时间限制 1 0s 内存限制 256 0MB 最小距离 问题描述 数轴上有n个数字 求最近的两个数 即min abs x y 输入格式 第一行包含一个整数
  • sEMG项目总结(3)STM32采集肌电信号

    STM32采集肌电信号 目录 STM32采集肌电信号 目录 1采集方式ADCTimerDMA 2采集程序的配置 3对采集的sEMG的分析 4STM32F407源码 1采集方式ADC Timer DMA 1 肌电信号采集板有双通道 信号的放大
  • Linux--文件、进程、fork、open、系统调用、库函数相关知识

    目录 1 进程打开文件的流程 2 先打开再fork的流程 重点 1 代码演示 2 分析 3 先fork再open 1 代码演示 2 分析 4 fork补充 5 系统调用与库函数的区别 1 进程打开文件的流程 inode 节点 存放有关文件的