父进程为什么要创建子进程

父进程为什么要创建子进程,第1张

程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容可以考虑将那些需要对地址空间中的数据进行访问的 *** 作部分放到另外一个进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。具体的,可在进程中通过CreateProcess()函数去创建一个子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进程在运行期间的一个过程为此,需要由父进程来掌握子进程的启动、执行和退出。创建子进程才能多道程序并发执行,linux初始化的时候会创建swap进程、然后是init进程和一个init进程的兄弟进程,所有的进程(运行的程序)都是从父进程演化出去的,你可以看看proc里的东西,写个程序打印出各个进程的父进程~网上有源代码的,要的话我给你。咱要先搞明白进程究竟是什么,进程是资源分配的单位,是运行的程序,既然是运行的程序,一个进程自然只能代表一个程序,多道程序设计自然而然就有了多进程的概念。

我个人觉得这跟汇编语句执行时的一种优化策略——分支预测 有点类似,分支预测讲的是在一个for循环100次的程序中,其选择分支跳转的语句,有99次跳转和1次不跳转,那么CPU在处理分支跳转时会默认当作跳转处理,以节省99次跳转的时间,而那一次不跳转则会由于这种默认而浪费时钟周期重新取指令,这种将普遍情况设为默认的做法,与我们的问题场景比较类似,因为在主进程创建子进程后往往需要等子进程完成其运行并返回结果才能使主进程继续运行,以至于fork()函数常常与wait()函数搭配使用以控制程序的运行次序,所以在大多数情况下,父进程创建完子进程后将资源让渡给子进程会更有利于程序的运行,这种情况如此普遍以至于成为一种默认的调度方式以在大多数情况下节省调度时间。

个人理解,仅供参考。

fork()函数,Linux系统调用

头文件:

#include <unistd.h>

函数定义:

int fork( void )

返回值:

子进程中返回0,父进程中返回子进程ID,出错返回-1

函数说明:

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。

‘fork()’函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。你可以通过检查‘fork()’函数的返回值知道哪个是父进程,哪个是子进程。父进程得到的返回值是子进程的进程号,而子进程则返回0。以下这个范例程序说明它的基本功能: //------------------------------ example 1 pid_t pid

switch (pid = fork())

{

case -1:

/* 这里pid为-1,fork函数失败 */

/* 一些可能的原因是 */

/* 进程数或虚拟内存用尽 */

perror("The fork failed!")

break

case 0:

/* pid为0,子进程 */

/* 这里,我们是孩子,要做什么? */

/* ... */

/* 但是做完后, 我们需要做类似下面: */

_exit(0)

default:

/* pid大于0,为父进程得到的子进程号 */

printf("Child's pid is %d\n",pid)

}//------------------------------ example 2#define TRUE 1

while (TRUE){ /* repeat forever */

type_prompt() /* display prompt on the screen */

read_command(command, parameters) /* read input from terminal */

if (fork() != 0){/* fork off child process */

/* Parent code. */

waitpid(1, &status, 0) /* wait for child to exit */

} else {

/* Child code. */

execve(command, parameters, 0) /* execute command */

}

}

这些是我再网上帮你找到的资料,看完之后,自己也学到不少,呵呵 ^^

希望它对你有点帮助吧,好好体会

还有一点就是进程的定义:进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。说白了进程就是正在运行的程序,比如说有程序 p1 和 p2,当程序p1运行是就是进程p1 ,如果正在运行的是p2,那么就是进程p2


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8669740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存