系统编程-进程-当文件操作遇上fork
我的关联博文:
系统编程-进程-fork深度理解、vfork简介
系统编程-进程-先后fork或open一个文件的区别
test1: lseek基本使用
#include <stdio.h> #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <unistd.h> #include <string.h> char string_buf[] = "hello"; char char_H = 'H'; int main(){ int fd = open("file.txt", O_CREAT|O_RDWR|O_TRUNC, S_IRWXU); printf("sizeof(string_buf) = %ld \n", strlen(string_buf)); ssize_t bytes_done = write(fd, string_buf, strlen(string_buf));
printf("bytes_done = %ld \n", bytes_done);
// 创建新文件,向该新文件写入5个字节的字符串。 off_t offset = lseek(fd, 10, SEEK_END);
printf("offset = %ld \n", offset);
// 偏移到文件末尾+10字节位置处,也就是说,
// 下一次将写入的位置是该文件的第16字节位置处(从文件的第1字节位置开始计算) ssize_t add_1_byte = write(fd, &char_H, 1);
printf("add_1_byte = %ld \n", add_1_byte);
// 在该文件的第16字节处写入一个ascii字符‘H’ close(fd); return 0;
}
探究父子进程的文件描述符、文件表项、I节点,
以lseek+fork实验为切入点进行分析。
实验思路:
做两个实验,一是先fork,父进程先lseek后, 子进程才write,观察子进程写入该文件的偏移在哪。
再一个实验是,先lseek,然后才fork。
test2
探究父子进程的文件描述符、文件表项、I节点
以lseek+fork实验为切入点进行分析
实验思路:先fork,父进程先lseek后, 子进程才write,观察子进程写入该文件的偏移在哪。
#include <stdio.h> #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <unistd.h> #include <string.h> char string_buf[] = "hello"; char char_H = 'H'; int main(){ int fd = open("file.txt", O_CREAT|O_RDWR|O_TRUNC, S_IRWXU); printf("sizeof(string_buf) = %ld \n", strlen(string_buf)); ssize_t bytes_done = write(fd, string_buf, strlen(string_buf));
printf("bytes_done = %ld \n", bytes_done);
// 创建新文件,向该新文件写入5个字节的字符串。 pid_t pid = fork();
if(pid < 0){
perror("fork "); }else if( pid > 0){ off_t offset = lseek(fd, 10, SEEK_END);
printf("offset = %ld \n", offset);
// 偏移到文件末尾+10字节位置处,也就是说,
// 下一次将写入的位置是该文件的第16字节位置处(从文件的第1字节位置开始计算) }else{
sleep(1); ssize_t add_1_byte = write(fd, &char_H, 1);
printf("add_1_byte = %ld \n", add_1_byte);
// 在该文件的第16字节处写入一个ascii字符‘H’ } close(fd); return 0;
}
编译运行:
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当
文件操作遇上fork# gcc test.c
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当
文件操作遇上fork# ./a.out
sizeof(string_buf) = 5
bytes_done = 5
offset = 15
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当
文件操作遇上fork# add_1_byte = 1
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当
文件操作遇上fork# hexdump -C -n 100 file.txt
00000000 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 48 |hello..........H|
00000010
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当文件操作遇上fork#
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当文件操作遇上fork#
实验现象: 父进程在fork前打开了文件,父进程先执行lseek, 子进程延时1秒后才执行写文件,则会受父进程刚才的lseek操作影响。
小结: 文件偏移量这一信息记录在内核的文件表项中,父子进程有自己独立的文件描述符表,但是共享文件表项和I节点。
本实验父子进程实际上操作的是同一个文件表项,所以才产生了这种现象。
test3
探究父子进程的文件描述符、文件表项、I节点
以lseek+fork实验为切入点进行分析
实验思路:先lseek,然后才fork...
#include <stdio.h> #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <unistd.h> #include <string.h> char string_buf[] = "hello"; char char_H = 'H'; char char_L = 'L'; int main(){ int fd = open("file.txt", O_CREAT|O_RDWR|O_TRUNC, S_IRWXU); printf("sizeof(string_buf) = %ld \n", strlen(string_buf)); ssize_t bytes_done = write(fd, string_buf, strlen(string_buf));
printf("bytes_done = %ld \n", bytes_done);
// 创建新文件,向该新文件写入5个字节的字符串。 off_t offset = lseek(fd, 10, SEEK_END);
printf("offset = %ld \n", offset);
// 偏移到文件末尾+10字节位置处,也就是说,
// 下一次将写入的位置是该文件的第16字节位置处(从文件的第1字节位置开始计算) pid_t pid = fork();
if(pid < 0){
perror("fork "); }else if( pid > 0){ ssize_t add_1_byte = write(fd, &char_L, 1);
printf("add_1_byte = %ld \n", add_1_byte);
// 在该文件的第16字节处写入一个ascii字符‘H’ }else{
sleep(1); ssize_t add_1_byte = write(fd, &char_H, 1);
printf("add_1_byte = %ld \n", add_1_byte);
// 在该文件的第16字节处写入一个ascii字符‘H’ } close(fd); return 0;
}
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当文件操作遇上fork# gcc test.c
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当文件操作遇上fork# ./a.out
sizeof(string_buf) = 5
bytes_done = 5
offset = 15
add_1_byte = 1
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当文件操作遇上fork# add_1_byte = 1
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当文件操作遇上fork# hexdump -C -n 100 file.txt
00000000 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 4c |hello..........L|
00000010 48 |H|
00000011
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/当文件操作遇上fork#
小结: 同上一个实验。即:
文件偏移量这一信息记录在内核的文件表项中,父子进程有自己独立的文件描述符表,但是共享文件表项和I节点。
本实验父子进程实际上操作的是同一个文件表项,所以才产生了这种现象。
内核文件结构:

本博文test2、test3中,父子进程操作同一个文件表项,如下图所示

.
系统编程-进程-当文件操作遇上fork的更多相关文章
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- linux系统编程-进程
进程 现实生活中 在很多的场景中的事情都是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的: 如下是一段视频,迈克杰克逊的一段视频: http://v.youku.com ...
- linux服务器开发二(系统编程)--进程相关
进程相关的概念 程序与进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(CPU.内存.打开的文件.设备.锁等等). 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...
- Linux系统编程@进程管理(一)
课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...
- Unix系统编程()文件描述符和打开文件之间的关系
目前学习到的是一个文件描述符对应着一个打开的文件,似乎是对应的关系.但是实际上并不是这样的.多个文件描述符指向同一个打开的文件,是可能的也是必要的.这些文件描述符可以在相同或者不同的进程中打开. 要理 ...
- python常用标准库(os系统模块、shutil文件操作模块)
常用的标准库 系统模块 import os 系统模块用于对系统进行操作. 常用方法 os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作.文件的删除创建等详细资料可以参考官方文 ...
- Linux系统编程@进程管理(二)
1.创建守护进程(Deamon) 守护进程的概念与作用 后台服务程序 – 系统服务,进程名字往往以’d’结尾,生存周期比较长(系统装入时启动,关闭时候终止.系统装入两种启动方式:1从启动脚本.etc/ ...
- hadoop的hdfs文件操作实现上传文件到hdfs
这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到 ...
- [linux] C语言Linux系统编程进程基本概念
1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...
- day11 文件操作(上)
目录 一.什么是文件 二.为何要用文件 三.如何使用文件 3.1文件操作的基本流程 3.2资源回收with上下文管理 3.3指定操作文本的字符编码 四.文件的操作模式 4.1控制文件读写操作的模式(t ...
随机推荐
- AT_arc149_a 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 求满足以下条件的小于 \(10 ^ n\) 数最大是多少? 每一位数字均相同: 是 \ ...
- C# LINQ之IEqualityComparer<>接口应用
在C#语言中,对集合的条件查询.分组统计等操作使用LINQ非常方便,LINQ的语法格式与SQL非常相似和便捷,而LINQ扩展方法配合Lambda更为简洁,如All.Any.Count.Max等Enum ...
- Nginx 工作原理简介
在了解Nginx工作原理之前,我们先来了解下几个基本的概念 以及常见的I/O模型. 基本概念 同步:就是指调用方发起一个调用,在没有得到调用结果之前,该调用不返回.换句话说,也就是调用方发起一个调用后 ...
- 技术文档必备工具:注释目录树神器 Annotree,我的第一个正式开源项目
hi,大家好,我是爱听书的程序员阿超 非常开心能在这里介绍我的第一个正式开源项目 Annotree,项目具体情况如下,请继续阅读~ Annotree 注释树 一款生成带注释的目录树工具,大大方便技术文 ...
- Umov移动方块-scratch编程作品
程序说明: <Umov移动方块>是一款基于Scratch平台制作的小游戏.在这个游戏中,玩家将面对一个3×3的圆圈棋盘,并通过鼠标控制蓝色方块在这些圆圈中灵活移动.游戏的挑战在于,舞台的四 ...
- Excel函数-相对引用和绝对引用
1.相对引用 公式填充时引用的相对位置不变,行和列.序号都相对递增 2.绝对引用 公式填充时应用的单元格绝对位置不变,行和列.序号都不变.绝对引用的符号是"$",也可以快捷键按F4 ...
- 【Java】Oshi 硬件信息读取库
实现的功能: 用于开发服务器监控面板,获取服务器硬件参数 官方Github仓库地址: https://github.com/oshi/oshi Maven坐标: <!-- https://mvn ...
- 【Docker】03 基础操作
[Docker 本体操作相关] 检查Docker版本: docker -v 检查Docker当前状态: systemctl status docker 停止Docker与开启Docker system ...
- 绑定国内主机IP的域名网站必须要备案
买了个域名: http://devilmaycry812839668.top/ 然后绑定了国内的一个云主机,刚搭了个web server,一个网页都没有(短期内页没考虑做网页): 今天看了下web s ...
- 【转载】 Ubuntu下使用VSCode的launch.json及tasks.json编写
版权声明:本文为CSDN博主「子木呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_41687938/a ...