fork()函数的学习

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
转的一篇文章:
fork函数的学习。
先看这段范例代码:
#include <unistd.h>


#include 
<sys/types.h>


main () 





   pid_t pid; 


        pid
=fork(); 


        
if (pid < 0


                printf(
"error in fork!"); 


        
else if (pid == 0


                printf(
"i am the child process, my process id is %dn",getpid()); 


        
else 


                printf(
"i am the parent process, my process id is %dn",getpid()); 



}
 

这段代码写了一个使用fork函数创建子进程,父子进程同时运行而产生交错的,不一样的运行结果。
运行结果如下:
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285 
      fork在英文是叉子,分叉的意思,在函数fork,取后面的意思。很形象的表示程序从这里分叉,fork函数创建了子进程,子进程和父进程同时(其实是cpu分时处理)开始运行分叉之后的程序。
      我把程序改写了一下: 

 

#include <unistd.h>
#include 
<sys/types.h>
main()
{
        pid_t pid;
        printf(
"/n[%d]not fork pid=%d/n",getpid(),pid);
        pid
=fork();
        printf(
"/n[%d]forked pid=%d/n",getpid(),pid);
        
if(pid<0)
        
{
                printf(
"error in fork!/n");
                getchar();
                exit(
1);
        }

        
else if(pid==0)
                printf(
"/n[%d]in child process,p_id=%d/n",getpid(),getpid());
        
else
        
{
                printf(
"/n[%d]in parent process,my pid=%d/n",getpid(),pid);
                printf(
"/n[%d]in parent process,my getpid=%d/n",getpid(),getpid());

        }

}


程序运行结果如下:
[hardy@localhost fork]$ ./fork

[3819]not fork

[3820]forked pid=0

[3820]in child process,p_id=3820

[3819]forked pid=3820

[3819]in parent process,my pid=3820

[3819]in parent process,my getpid=3819

可以清楚的看到 not fork只打印了一次,其中[3819]是父进程的进程号,创建fork以后,fork函数返回给父进程的值pid是子进程的进程号[3820],而在子进程,pid值为零。也就是说子进程,pid被置零。

引用网上一位网友的解释“其实就相当于链表,进程形成了链表,父进程pid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其pid为0. 

下面有一个很有意思的程序:
#include <sys/types.h>
#include 
<unistd.h>

int main()
{
        
int i;
        
for( i= 0; i< 3; i++)
        
{
                
int pid= fork();
                
if(pid== 0)
                
{
                        printf(
"son/n");
                }

                
else
                
{
                        printf(
"father/n");
                }

        }

        
return 0;
}


大家想想看最后将出现几个son 几个father呢?








对一下答案吧:
[hardy@localhost fork]$ ./fork
father
son
son
son
father
father
son
father
son
son
father
father
son
father

总共7个son7个father。你答对了么?

这道题需要在纸上画画才好理解
for            i=0         1           2
               father     father     father
                                           son
                              son       father
                                            son
               son       father        father
                                             son
                              son         father
                                             son
其中每一行分别代表一个进程的运行打印结果。
当产生子进程的时刻,子进程打印son,当子进程调用fork的生成子子进程,他就提升为father。
总结来说,father永远打印father,son在fork之前是son,fork之后就为father,同时生成新的son。
这个比喻就像真正的父子,孩子长大了生了小孩,孩子就成了父亲。而父亲永远是父亲。
从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击 本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。 阅读详情

相关推荐

公交车调度排班优化算法研究与实现

本文提出的公交车调度排班优化算法基于遗传算法,能够较好地处理公交车调度排班问题,使得车辆数量和运营时间得到平衡,公交车的使用效率得到了优化。在模拟的公交车路线中,使用本文所提出的算法,得到了一组较优的公交车调度排班方案。其中,车辆数量的多少会影响到公交车的行驶速度和等候时间,而运营时间的长短则会直接影响到公交车的使用效率和成本。本文基于遗传算法,通过随机生成种群、选择、交叉、变异等操作,逐步优化种群中个体的适应度,最终得到较优的公交车调度排班方案。以下是本文中所使用的Matlab代码实现,供参考。

PixelLoom的博客 853

fork函数

fork在英语中的意思就是分裂的意思 Linux命令中就是复制进程的作用 在Linux中 它被包含在在<unistd.h>头文件中 特点: fork分裂之后的多进程之间互不干涉 占用同一块虚拟内存 pid_t pid = fork()这句话的意思就是说fork()函数的返回值是pid_t 类型的 在父进程中pid的值是子进程的进程标识 在子进程中的pid的值是0 下面一段代码验证上述: ...

qq_45829112的博客 1563

人像美肤 人体美型 CVPR 2022 ABPN

人像美肤 CVPR 2022 ABPN

jacke121的专栏 818

fork()pid

写在前面:最近学到Linux的进程间通信,发现以前学的进程有点忘了,就找了一些博客来看,这篇博客讲的挺简单易懂的,就搬运来当笔记了,原文也是转载的找不到出处,有知道的可以告诉我,我再加上。 fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:     1)在父进程中,fork返回新创建子进程的进程ID; &...

qq_38661220的博客 5747

linux中fork() 函数详解

fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了...

weixin_33804990的博客 2874

创建进程-fork()函数

fork()的作用是创建一个子进程。

qi琪的专栏 1756

Linux 学习笔记(五):fork() 系统调用

Linux 学习笔记(五):fork() 系统调用

Amentos的博客 1499

有关fork()函数学习

** 程序一、 ** 输出结果: 上面的程序不太好分析fork()在其中起的作用,我们稍微修改一下源程序 #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include &l...

weixin_43863342的博客 308

关于fork()函数学习

关于fork()函数学习 一、理解fork()是什么 1、一次调用,两次返回 2、调用fork()之后,产生一个子进程,子进程继承父进程的所有东西 3、返回0,代表当前进程是子进程,否则为父进程 二、实验分析 实验1 void fork1() { if (fork() == 0) { printf("Hello from child\n"); } else { printf("Hello fr...

weixin_44039639的博客 251

linux fork() 函数学习

linux fork() 函数学习分类:专业学习#include #include #include int main(){    pid_t pid;    static int n = 0;    printf("fork!/n"); /*printf("fork!")*/    switch (pid = fork())    {        case -1:        {

qipnx的专栏 3047

操作系统学习心得之——fork()函数

接下来大概 XXX 分钟里,我将根据老师给的三道例题,用我认为最通俗易懂的讲解带大家理解fork()函数fork()函数基础 首先是对这个函数的介绍,fork()函数很特别,似乎仅存在在Linux系统里。(我才疏学浅,可能还有其他系统里也可以使用但我不知道)它的作用是创建一个新的进程,同时在不同进程里又会有不同的值。在父进程里,fork()函数的值是子函数pid,而在子函数里,fo...

weixin_44019423的博客 2363

Linux fork()函数学习

     在 UNIX 系统中,用户创建一个新进程的唯一方法就是调用系统调用 fork。调 用 fork 的进程称为父进程,而新创建的进程叫做子进程。系统调用的语法格式:    pid = fork();    在从系统调用 fork 中返回时,两个进程除了返回值 pid 不同外,具有完全一样的用户级上下文。在子进程中,pid 的值为零。在系统启动时由核心内 部地创建的进程0是唯一不通

韦编二绝 1297

linux fork()函数学习

#include #include #include int main(){    pid_t pid;    static int n = 0;    printf("fork!/n"); /*printf("fork!")*/    switch (pid = fork())    {        case -1:        {            /* 这里pid-1,fork函数

Linux嵌入式开发 389

学习笔记——fork()函数和vfork()函数详解

先来认识认识fork fork()函数是创建进程函数。 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 其函数原型为: pid_t fork( void); 当调用fork()时,将执行以下动作: 向系统申请一个新PID 创建子进程,复制父进程的PCB,获得父进程的数据空间、堆、栈等资源的副本 在父进程中返回子进程的PID,在子进程中返回0 执行

打不倒的程序猿 1171

nginx源码学习fork()函数详解

fork()函数 作用: 产生一个新的进程 该进程在此语句之后,和父进程一起执行fork函数之后的代码 返回值: 子进程会返回一个pid_t的值,为0 父进程会返回一个大于0的值,实际上是子进程的pid 内存问题: fork产生新进程非常快,但产生的新进程并不复制原进程的内存空间,而是和父进程一起共享内存,只有当修改内存时,才会复制一份新的内存给该进程单独使用 僵尸进程: 子进程被杀死,但是父进程...

qq_40666620的博客 747

【操作系统】fork()、exec()函数学习笔记

fork()函数可以创建一个新的进程,该进程是父进程的拷贝,称为子进程。 exec()函数可以在当前进程中执行一个新的函数fork()函数的例子如下: #include #include /* *说明: 本例参考了ALP *函数名: main *函数功能: 通过fork()函数创建进程,并获得子进程和父进程的进程号 *修改时间: 2013

ffddybz的专栏 1551

零基础学习linux中的fork()函数

零基础学习fork()函数     一个进程,包括代码、数据和分配给进程的资源。fork的原意是:分裂。fork()函数通过系统调用创建(分裂)一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。      一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复

即使没有翅膀,心也要飞翔! 898

GEEK学习笔记— —Linux中fork()函数

基本知识一个进程调用fork()函数后,会通过系统调用创建一个与原来进程几乎完全相同的进程,但如果初始参数或者传入的变量不同,两个进程可以做不同的事。使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。 子进程与父进程的区别在于: 1、父进程设置

Sin_Geek成长の迹 960

Linux学习笔记:fork()函数

Linux学习笔记:fork()函数

m0_70088853的博客 472

进程学习(一)——fork()和vfork()函数学习过程

fork()函数

菜鸟学C/C++ 1720
上一篇: 写时复制
下一篇: 只能在保护模式下执行的指令
w5543081
博客等级 码龄19年 30粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值