2024年4月8日发(作者:)

父进程和子进程

子进程是父进程的复制品

Unix/linux系统中的进程创建是这样的,理解起来有点绕。

父进程先执行fork()系统调用,这个调用的结果是系统中多出了一个跟父

进程内容完全一样的进程,这个新进程被称为子进程,当然该进程的PCB

中父进程指针是指向第一个进程的。

前后两个进程各自有自己的地址空间,形式上有点像把一个文件拷贝了一

个副本。虽然资源也相互独立,但拷贝时父进程执行过程已生成的数据,

子进程也拷了一份。说简单点像一个执行到半路的程序突然在系统中多出

了一个孪生兄弟,什么都跟自己一样,但要管自己叫老爸。

当然这样的简单复制本身是没什么用处的。要让它发挥作用,还需要再执

行 exec( B )系统调用,这个调用可以让当前进程转而执行另一个可执行代

码〔一个新的程序〕。简单的说进程本来在执行A程序,一旦执行到这个

调用,就转而开始执行B程序。

至此,父子两进程就变的不一样了,但不管它们各自执行的什么代码,其

父子关系不会改变,在父进程中可以使用子进程的进程ID〔在执行fork()

时的返回值中得到〕来中止子进程的执行。当然子进程也可以因为自己的

执行程序结束而终止执行

父进程和子进程先后执行的问题,是这样的,在fork之后,是父进程先执

行,然后一个时间片到达之后就是子进程再执行了。

每一个进程都有一个父进程,当进程终止或者结束的时候,都会给父进程

发送一个SIGCHLD信号,系统默认是父进程忽略这个信号,如果父进程希

望被告知其子进程的这种状态改变,则应该捕获这个信号,捕捉函数一般

是wait函数来取得子进程ID和子进程状态。

对于键盘上的Ctrl+按键的操作,一般是产生一个信号,然后进程捕捉这个

信号。另外当然我们可以直接使用这些信号,通过kill命令,把信号发给

相应的其他进程。