linux C语言fork进程学习

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

char str[11]={0};

int main(int argc, char ** argv)
{
int fd = open("test.txt",O_RDWR);
if(fork() == 0){
	ssize_t cnt = read(fd,str,10);
	printf("Child process:%s\n",str);
}
else{
		ssize_t cnt = read(fd,str,10);
	printf("Parent process:%s\n",str);
}
printf("read over\n");
close(fd);
return 0;
}

 可以发现,两个进程读到的内容并不一样,这是为什么呢?fork出来的进程用的资源不是父进程的一个拷贝吗?

实际上,这跟进程的PCB,也就是struct task_struct有关,进程打开的文件用struct file_struct *files表示,这实际是一个指针。在fork出子进程后,这个指针也会被copy到子进程的struct task_struct对象中,也就是父进程和子进程的*files是一样的。也就是使用了指向同一个文件对象的指针,再考虑到读取文件时一般加锁了。所以父进程读完后,会修改offset,而子进程读取数据的时候,是基于修改后的offset的。就会造成了上述问题。

那么,对于写呢?

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

char str[11]={0};
char str1[6] = "hello";
char str2[6] = "world";

int main(int argc, char ** argv)
{
int fd = open("test.txt",O_RDWR);
if(fork() == 0){
//	ssize_t cnt = read(fd,str,10);
	write(fd,str1,6);
	printf("Child process:%s\n",str);
}
else{
//		ssize_t cnt = read(fd,str,10);
write(fd,str2,6);
	printf("Parent process:%s\n",str);
}
printf("write over\n");
close(fd);
return 0;
}

可以发现,也是同样的效果,共用了同一个files,造成先后顺序写入内容。

这说明了,使用fork()得到的父子进程在操作同一个文件的时候,并不能像两个独立进程操作一个文件一样(如果两次写,只保留一份,后面的会把前面的冲掉)

 

如何基于Nginx进行性能优化!性能优化看这篇就对了! 阅读详情

相关推荐

Linux c进程管理—创建进程 system、execl、execlp、fork

Linux c 进程管理:   1.      创建进程:        system函数:         int system(const char*filename);                                                  建立独立进程,拥有独立的代码空间,内存空间

Y_23k_bug的专栏 9813

Rancher - 增加 worker_connections 数量的解决方案

这样,你就可以增加Rancher的worker_connections数量,从而提高服务器的并发处理能力,解决"worker_connections are not enough"的问题。在使用Rancher进行编程时,你可能会遇到一个错误信息,提示"worker_connections are not enough",这表明Rancher的worker_connections数量不足以处理当前的请求负载。通过增加该参数,你可以提高服务器的并发处理能力,从而解决请求处理不足的问题。希望这个回答对你有帮助!

TechSavant的博客 724

Nginx实战:性能调优/配置优化-相关指令

nginx的性能调优

龙叔运维的博客 4545

分享 11 个常用的 Nginx 性能优化参数工作

编辑:业余草来源:https://www.xttblog.com/?p=4957分享 11 个常用的 Nginx 性能优化参数教程工作上,需要配置 Nginx,要投入生产使用,做了一点...

xmt1139057136的专栏 4472

NGINX快速入门(06)Nginx性能参数调优

Nginx是一个多进程单线程的应用。它有很多配置参数可以根据实际情况进行调优,来进一步增大并发性能。 调优参数一:worker_processes worker_processes表示worker线程的数量,每个worker进程都是单线程的进程,它们会调用各个模块以实现多种多样的功能。如果这些模块确认不会出现阻塞式的调用,那么,有多少CPU内核就应该配置多少个进程;反之,如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程。例如,如果业务方面会致使用户请求大量读取本地磁盘上的静态资源文.

Blues的专栏 872

(《Linux环境下C语言编程指南》学习笔记二)C语言进程的创建(fork和vfork函数的异同)

今天在看Linux下C语言进程控制,了解了下fork函数和vfork函数。        系统调用fork函数用于派生一个进程,系统将创建一个与当前进程相同的新的进程,子进程是父进程的一个拷贝,他们的数据相同,但是使用不同的数据段和堆栈段,具体不同的元素有:进程ID,子进程运行时间记录,父进程对文件的锁定。具体代码实现如下: #include #include #includ

989

linux进程的创建函数,(《Linux环境下C语言编程指南》学习笔记二)C语言进程的创建(fork和vfork函数的异同)...

今天在看Linux下C语言进程控制,了解了下fork函数和vfork函数。系统调用fork函数用于派生一个进程,系统将创建一个与当前进程相同的新的进程,子进程是父进程的一个拷贝,他们的数据相同,但是使用不同的数据段和堆栈段,具体不同的元素有:进程ID,子进程运行时间记录,父进程对文件的锁定。具体代码实现如下:#include #include #include #include //包含fork...

weixin_35715190的博客 155

操作系统实验报告——实验一:熟悉Linux命令及进程管理

实验目的 熟悉Linux系统,掌握Linux系统的登入、退出等操作; 熟悉Linux命令及进程管理、作业控制; 学会使用Linux下C语言编程的基本知识; 掌握Linux中vi的基本操作; 掌握Linux进程创建、调用、终止、阻塞等操作。 实验内容和步骤 Linux基本操作; 文件与目录操作; 进程查看与在线帮助; 全屏幕文本编辑器vi的使用; Linux下C语言编程基础知识 编译并运行以下程序:hello.c,getpid_test.c,fork_test.c,exit_test1.c

u011225873的博客 4153

Linux下编写一个关于运用进程函数fork(),sleep(),wait(),exit()的C程序(●----●)

Hi,百无聊赖写blog。本文所涉及的所有内容是存在笔者没有发现的错误的,所以请以批判的角度阅读,希望高手留下珍贵的留言,于此感激不尽。 然后,这些是记录笔者个人对有关知识点的认知和理解,希望在recording的同时,能够提高我的英语词汇运用,也能够将自己对C语言的热爱,开源和分享的思想在社区传播。 Alright!Nonsense is over,let's get into the co...

weixin_41741302的博客 2155

【并发程序设计】总篇集 Linux下 C语言 实现并发程序

进程概念 进程创建 进程常用命令 进程并发 父子进程 线程概念 线程创建 线程池 同步互斥 线程回收 条件变量 内存映射 进程间通信 有名管道 无名管道 信号机制 消息队列 信号灯(信号量)

2201_75563094的博客 1597

【基础学习六十五】Linux进程线程与进程间通信

进程是一个独立可调度的任务,在系统执行某个程序时会分配和释放许多资源,进程是一个程序的一次执行过程,进程是程序执行和资源管理的最小单位。

2501_93649289的博客 1209

操作系统 子进程与父进程所使用的函数详解

一、fork() (1)linux c语言 fork() 和 exec 函数的简介和用法 https://www.cnblogs.com/dongguolei/p/8098181.html 二、wait() (1)Linux wait函数详解 https://www.cnblogs.com/zhanggaofeng/p/6073568.html 三、exec()函数族 (1)linux c语言 f...

JxufeCarol的博客 561

Linux平台纯C实现的TCP多进程聊天程序,带注册登录与本地用户存储

这个资源是面向Linux系统的轻量级TCP聊天工具,用标准C语言编写,不依赖数据库或第三方框架。服务端server.c采用fork进程模型,每个客户端连接由独立子进程处理,互不干扰;客户端client.c支持三种操作:输入账号密码登录、新用户注册(信息写入userlist文本文件)、收发文字消息。userlist需手动创建并设置可写权限,用于持久化保存用户名等基础注册数据。退出机制简单明确:客户端输入exit断开连接,服务端输入exit终止整个服务。配套的client.h和server.h头文件封装了so

e4f5g6h7的博客 336

揭秘:C 语言构建 Shell,这些关键要点被你忽视了

对于很多人来说,常常会不自觉地认为自己“算不上真正的程序员”。想想看,市面上那些大家日常都在使用的程序,功能强大又复杂,而开发它们的程序员仿佛自带光环,让人觉得高不可攀。但实际上,别看大型软件项目开发起来困难重重,很多时候其背后的基本原理并没有那么神秘,是相当简单易懂的。自己动手去实现这些软件,可是一种超棒的方式,能让你切实感受到自己也具备成为真正程序员的实力,而且这个过程充满乐趣哦!接下来,我就详细地给大家讲讲,我是如何用C语言编写一个简单的Unix shell的,希望通过我的分享,能让大家也有同样的体会

一个时代的落幕,一个时代的开启。 18

C语言实现轻量Shell,打通语言到实战的硬核项目拆解

大家好我是知识有点料,每天给大家带来最新动态,分享实用干货,内容随缘更,质量在线;如果你觉得这些信息对生活有用,就点个关注~很多程序员学完C语言基础,都会陷入一个瓶颈:语法都会

dai_jiaqi的博客 163

初学-Linux进程-fork();vfork()、wait...;system等函数的使用

Linux中c语言编程,多进程的初步入门,以及各种api的使用。

坏柠的博客 1445

Linux进程学习---fork()和vfork()

通过 上一部分的学习,我们了解了进程的概念以及在Linux进程的实现,此部分我们将具体学习如何在Linux中创建一个进程。  一前言:  通过原理知识的学习,我们知道每个进程进程ID号标识。进程被创建时系统会为其分配一个唯一的进程ID号。当一个进程向其父进程(创建该进程进程)传递其终止消息时,意味这个进程的整个生命周期结束。此时,该进程占用的所用资源包括进程ID被全部释放。 

twtydgo的专栏 422

操作系统概念Linux下用 C语言 fork()函数创建进程的实验及解释

这是我们操作系统课的一个实验 一、实验目的: 加深对进程概念的理解,明确进程和程序的区别。进一步认识并发执行的实质。 认识进程生成的过程,学会使用fork生成子进程,并知道如何使子进程完成与父进程不同的工作。 二、实验要求: 进行Linux(可选)下的创建进程实验并提供截图和源代码 三、实验准备 首先学习了一下fork()的用法和特点,这几点是要注意的: 1、进...

Janking's Blog 8315

Linux C | 进程】创建进程 | fork函数详解

本文详细介绍 fork 函数,并列举C语言例子进行说明。

wkd_007的博客 2583
上一篇: 依据官网教程步步为营学习CmakeLists文件编写
下一篇: 在linux中的shell执行命令与进程创建
土豆西瓜大芝麻
博客等级 码龄18年 1146粉丝 238原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值