fork函数分析

fork函数

父进程通过调用fork函数来创建一个子进程

在这里插入图片描述

  • 新创建的子进程几乎但不完全与父进程相同,子进程与父进程最大的区别在于他们有不同的PID
  • fork函数调用一次,返回两次,在父进程中,fork返回子进程的PID,在子进程中,fork返回0.
  • 并发执行,子进程与父进程是并发执行的独立程序。内核能够以任意方式交替执行它们的逻辑控制流中的指令。(在我们的系统上运行这个程序时,父进程先完成它的printf语句,然后是子进程。然而,在另一个系统上可能正好相反)

每个进程都会有一个唯一的正数(非零)进程ID/PID.getpid函数返回调用进程的PID,getppid函数返回父进程的PID(调用调用进程的进程)。
在这里插入图片描述
下面对不同的fork函数代码进行分析:
fork0,最简单的fork函数,代码如下:

void fork0() 
{
    if (fork() == 0) {
	printf("Hello from child\n");
    }
    else {
	printf("Hello from parent\n");
    }
}

运行结果如下:
在这里插入图片描述
fork1

void fork1()
{
    int x = 1;
    pid_t pid = fork();

    if (pid == 0) {
	printf("Child has x = %d\n", ++x);
    } 
    else {
	printf("Parent has x = %d\n", --x);
    }
    printf("Bye from process %d with x = %d\n", getpid(), x);
}

运行结果:
在这里插入图片描述

子进程的PID=73613,而父进程的PID=73612.父进程先完成printf。

fork2

void fork2()
{
    printf("L0\n");
    fork();
    printf("L1\n");    
    fork();
    printf("Bye\n");
}

流程图如下:

在这里插入图片描述

运行结果如下:
在这里插入图片描述
fork3

void fork3()
{
    printf("L0\n");
    fork();
    printf("L1\n");    
    fork();
    printf("L2\n");    
    fork();
    printf("Bye\n");
}

流程图如下:
在这里插入图片描述

运行结果如下:
在这里插入图片描述

fork4

void fork4()
{
    printf("L0\n");
    if (fork() != 0) {
	printf("L1\n");    
	if (fork() != 0) {
	    printf("L2\n");
	}
    }
    printf("Bye\n");
}

流程图如下:
在这里插入图片描述
运行结果如下:

fork5

void fork5()
{
    printf("L0\n");
    if (fork() == 0) {
	printf("L1\n");    
	if (fork() == 0) {
	    printf("L2\n");
	}
    }
    printf("Bye\n");
}

流程图如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
主函数代码如下:

int main(int argc, char *argv[])
{
    int option = 0;
    if (argc > 1)
	option = atoi(argv[1]);
    switch(option) {
    case 0: fork0();
	break;
    case 1: fork1();
	break;
    case 2: fork2();
	break;
    case 3: fork3();
	break;
    case 4: fork4();
	break;
    case 5: fork5();
	break;
    default:
	printf("Unknown option %d\n", option);
	break;
    }
    return 0;
}

共有18个fork相关的函数,由于本人能力有限,只分析了较简单的几个fork,仅供参考。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:在Linux中,fork函数用于创建一个新的进程。它会复制父进程的数据空间、堆和栈,并将其作为子进程的副本。fork函数的返回值在子进程中为0,在父进程中为子进程的ID,出错时返回-1。 关于文件描述符的问题,文件描述符是对打开文件的引用。在fork函数调用之后,子进程会继承父进程的文件描述符。这意味着子进程可以访问到与父进程相同的打开文件。子进程会拥有父进程打开文件的副本,但是它们是独立的。也就是说,如果父进程或子进程修改了文件描述符,不会影响到对方的文件描述符。这样做可以实现进程间的独立性和隔离性。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Linux学习?fork用法](https://download.csdn.net/download/weixin_38630697/14070621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [分析fork后多进程对文件的共享](https://blog.csdn.net/weixin_34087307/article/details/94683295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值