阿里云个人网站备案做淘客,WordPress关键词过滤,怎么自己做H5网站,代做网站推广的公司参考地址 1.对fork函数的认识#xff1a; 一个进程#xff0c;包括代码、数据和分配给进程的资源。fork#xff08;#xff09;函数通过系统调用创建一个与原来进程几乎完全相同的进程#xff0c; 也就是两个进程可以做完全相同的事#xff0c;但如果初始参数或者传入的变…参考地址 1.对fork函数的认识 一个进程包括代码、数据和分配给进程的资源。fork函数通过系统调用创建一个与原来进程几乎完全相同的进程 也就是两个进程可以做完全相同的事但如果初始参数或者传入的变量不同两个进程也可以做不同的事。 一个进程调用fork函数后系统先给新的进程分配资源例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中只有少数值与原来的进程的值不同。相当于克隆了一个自己。 需要注意的一点就是调用fork函数之后一定是两个进程同时执行的代码段是fork函数之后的代码而之前的代码以及由父进程执行完毕。 我们来看一个例子 /** fork_test.c* version 1* Created on: 2010-5-29* Author: wangth*/
#include unistd.h
#include stdio.h
int main ()
{ pid_t fpid; //fpid表示fork函数返回的值int count0;fpidfork(); if (fpid 0) printf(error in fork!); else if (fpid 0) {printf(i am the child process, my process id is %d/n,getpid()); printf(我是爹的儿子/n);//对某些人来说中文看着更直白。count;}else {printf(i am the parent process, my process id is %d/n,getpid()); printf(我是孩子他爹/n);count;}printf(统计结果是: %d/n,count);return 0;
} 运行结果是 i am the child process, my process id is 5574 我是爹的儿子 统计结果是: 1 i am the parent process, my process id is 5573 我是孩子他爹 统计结果是: 1 在语句fpidfork()之前只有一个进程在执行这段代码但在这条语句之后就变成两个进程在执行了这两个进程的几乎完全相同将要执行的下一条语句都是if(fpid0)…… 为什么两个进程的fpid不同呢这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次却能够返回两次它可能有三种不同的返回值 1在父进程中fork返回新创建子进程的进程ID 2在子进程中fork返回0 3如果出现错误fork返回一个负值 在fork函数执行完毕后如果创建新进程成功则出现两个进程一个是子进程一个是父进程。在子进程中fork函数返回0在父进程中fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。 引用一位网友的话来解释fpid的值为什么在父子进程中不同。“其实就相当于链表进程形成了链表父进程的fpid(p 意味point)指向子进程的进程id, 因为子进程没有子进程所以其fpid为0. fork出错可能有两种原因 1当前的进程数已经达到了系统规定的上限这时errno的值被设置为EAGAIN。 2系统内存不足这时errno的值被设置为ENOMEM。 创建新进程成功后系统中出现两个基本完全相同的进程这两个进程执行没有固定的先后顺序哪个进程先执行要看系统的进程调度策略。每个进程都有一个独特互不相同的进程标识符process ID可以通过getpid函数获得还有一个记录父进程pid的变量可以通过getppid函数获得变量的值。 fork执行完毕后出现两个进程 有人说两个进程的内容完全一样啊怎么打印的结果不一样啊那是因为判断条件的原因上面列举的只是进程的代码和指令还有变量啊。执行完fork后进程1的变量为count0fpid0父进程。进程2的变量为count0fpid0子进程这两个进程的变量都是独立的存在不同的地址中不是共用的这点要注意。可以说我们就是通过fpid来识别和操作父子进程的。 还有人可能疑惑为什么不是从#include处开始复制代码的这是因为fork是把进程当前的情况拷贝一份执行fork时进程已经执行完了int count0;fork只拷贝下一个要执行的代码到新的进程。 附上3个练习题来透彻理解下 1. for(int i0;i2;i)
{fork();printf(hello\n);
}//打印多少次hello 在CSAPP中有个很方便的方法来分析图示如下 2. int main()
{fork()||fork();
}//一共新创建几个进程 2个。 3. #include unistd.h
#include stdio.hint main()
{fork();/*****/fork() fork() || fork();/*****/fork();/*****/sleep(100);return 0;
} 问题是不算main这个进程自身程序到底创建了多少个进程? 这是EMC的一道笔试题感觉挺有意思的这道题主要考了两个知识点一是逻辑运算符运行的特点二是对fork的理解。如果有一个这样的表达式cond1 cond2 || cond3 这句代码会怎样执行呢1、cond1为假那就不判断cond2了接着判断cond32、cond1为真这又要分为两种情况 a、cond2为真这就不需要判断cond3了 b、cond2为假那还得判断cond3fork调用的一个奇妙之处在于它仅仅被调用一次却能够返回两次它可能有三种不同的返回值1、在父进程中fork返回新创建子进程的进程ID2、在子进程中fork返回03、如果出现错误fork返回一个负值题干中说明了不用考虑这种情况在fork函数执行完毕后如果创建新进程成功则出现两个进程一个是子进程一个是父进程。在子进程中fork函数返回0在父进程中fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。 有了上面的知识之后下面我们来分析fork()fork()||fork()会创建几个新进程 很明显fork() fork() || fork()创建了4个新进程 总结 第一注释行的fork生成1个新进程第二注释行的三个fork生成448个新进程第三注释行的fork会生成10个新进程(这是因为前面总共有10个进程,而这10个进程每一个都会顺序执行最后的这个fork函数所以最后10个进程调用了10次fork生成10个新进程) 所以一共会生成181019个新进程转载于:https://www.cnblogs.com/fightformylife/p/4086856.html