linux系统fork

问题描述:在Linux中,用fork函数产生一个新的子进程,子进程结束后,子进程就成为了僵尸进程? 这篇文章主要介绍了linux系统和window系统区别,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。

linux fork 会共享哪些东西

linux系统fork的相关图片

僵尸进程的避免\x0d\x0a⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。\x0d\x0a⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。\x0d\x0a⒊ 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。\x0d\x0a⒋ 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收 还要自己做。

linux中的fork函数到底做了什么事的相关图片

linux中的fork函数到底做了什么事

fork()不仅创建出与父进程代码相同的子进程,而且父进程在fork执行点的所有上下文场景也被自动复制到子进程中,包括:

—全局和局部变量

—打开的文件句柄

—共享内存、消息等同步对象

由于pipe调用相当于创建了2个文件句柄,因此在fork后这两个句柄也被自动复制到子进程中,对这两个句柄的操作效果与在主进程中的操作效果是一致的,这就使父子进程之间很容易通过该机制实现数据交换,如:

假设pipe产生的句柄为P[0],P[1],在fork后父子进程都拥有了P[0],P[1]句柄,那么:

—父进程可向自己的P[1]中写入数据,子进程从P[0]中即可读出该数据;切记此时父进程不能也从P[0]读数据,否则自己写入的数据可能先被自己读走了。

—反之亦然,子进程向P[1]中写入数据后,父进程从P[0]中可读出该数据;切记此时子进程不要从P[0]读走数据。

你可能难以理解为什么进程内部的数据读写会被传递到另一个进程,但别忘了,pipe匿名管道和文件,socket等一样是属于操作系统的管理对象,对其进行读写都是由OS的内核代码来进行控制的。在父进程调用pipe创建出管道后,该管道对象是存储在OS内部的,父进程得到的P[0]和P[1]都只是对该对象的引用(相当于指针);在fork出子进程后,子进程复制出的也只是同一个指针,所指向的还是OS中的同一个对象,这就是为什么父子进程能通过其进行互相通信的原因。

linux fork进程怎么调试的相关图片

linux fork进程怎么调试

额........每启动一个进程并不一定要执行fork.fork只是系统最后封装的一个系统调用.你在程序里不使用fork的话.使用其它方式启动进程.就不是fork.fork族里有很多函数...............exec也可替换当前进程......系统内核里生成一个进程用的是clone这个函数.。

就比如要盖个房子.一个人干,要先挖土再调水泥再摆砖头再盖墙这样一步一步做.但是如果有多个人.就是可以多个人同时做这些事,一个挖土,一个调水泥.一个摆砖头.这样就省了很多时间.进程也是如此.fork的作用就是创建新进程.。

这么多人一起盖房子,总不能各自盖各自的,需要大家协调来做.不能土没挖好就摆砖,没放砖就抹水泥一样.这个时候需要一个工头来管理大家.工头通过每个人的名字来指挥每个人干活.进程就通过pid来指挥一个进程干活.工人需要知道自己的工头是谁,好向他报告碰到的情况.进程需要知道自己的父进程是谁报告自己的情况.。

这样就明白fork为何要返回进程的id了吧?fork是不会返回父进程的id的.。

工头找了一个新工人干活.从工头知道这个新工人的名字时刻开始,新工人就会投入这个团队一起干活了.fork返回pid的时候就表示这个进程在这个进程团队里了.工头可以直接告诉工人要干什么而不会让其他工人误以为这是自己的活.但是程序并没有这么智能.这个时候就需要有一个状态(if(!pid){....这是工人干的活...})表明这个工人的代码从什么位置开始,到什么位置结束.。

linux下的fork函数的相关图片

linux下的fork函数

如果你想跟踪子进程进行调试,可以使用set follow-fork-mode mode来设置fork跟随模式。

set follow-fork-mode 所带的mode参数可以是以下的一种:

parent

gdb只跟踪父进程,不跟踪子进程,这是默认的模式。

child

gdb在子进程产生以后只跟踪子进程,放弃对父进程的跟踪。

进入gdb以后,我们可以使用show follow-fork-mode来查看目前的跟踪模式。

可以看到目前使用的模式是parent。

然而,有的时候,我们想同时调试父进程和子进程,以上的方法就不能满足了。Linux提供了set detach-on-fork mode命令来供我们使用。其使用的mode可以是以下的一种:

on

只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。

off

父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定)。

另一个进程会被设置为暂停状态。

同样,show detach-on-fork显示了目前是的detach-on-fork模式,如上图。

以上是调试fork产生子进程的情况,但是如果子进程使用exec系统函数而装载了新程序执行呢?——我们使用set follow-exec-mode mode提供的模式来跟踪这个exec装载的程序。mode可以是以下的一种:

new 当发生exec的时候,如果这个选项是new,则新建一个inferior给执行起来的子进程,而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。

same 当发生exec的时候,如果这个选项是same(默认值),因为父进程已经退出,所以自动在执行exec的inferior上控制子进程。

linux 关于进程fork()的小问题 代码如下

不止三个,子进程仍然在循环体内,所以子进程也会根据它的i值来做循环,然后fork子进程的子进程,但是你的程序也有问题,父进程打印后没有等待子进程运行结束就return了,这样有些子进程还来不仅运行就退出了。所以你的程序的输出结果是不可靠的,也是可能是随机的(其结果会根据运行时操作系统的具体调度的不同而不同)。所以我给你改了一下,这样就能让所有被fork的子进程(包括这些子进程再次fork出来的子进程)都有机会运行。

int main()

int i;

int my_pid;。

int chld_pid;。

for( i= 0; i< 3; i++)。

{

chld_pid= fork();。

if(chld_pid== 0) {。

my_pid = getpid();。

printf("i = %d, child pid %d\n", i, my_pid);。

}

else {

my_pid = getpid();。

printf("i = %d, parent pid %d, child pid %d\n",i, my_pid, chld_pid);。

wait(0); /*waiting for the completion of child */。

}

}

return 0;

运行后的结果为:

i = 0, parent pid 5294, child pid 5295。

i = 0, child pid 5295。

i = 1, parent pid 5295, child pid 5296。

i = 1, child pid 5296。

i = 2, parent pid 5296, child pid 5297。

i = 2, child pid 5297。

i = 2, parent pid 5295, child pid 5298。

i = 2, child pid 5298。

i = 1, parent pid 5294, child pid 5299。

i = 1, child pid 5299。

i = 2, parent pid 5299, child pid 5300。

i = 2, child pid 5300。

i = 2, parent pid 5294, child pid 5301。

i = 2, child pid 5301。

这样你就可以看到,实际上有7个子进程被fork出来,其中有3个是被真正的父进程(5294)fork出来的,而其余的则是被5294的子进程(甚至子进程的子进程)所fork出来的。其中的逻辑关系从打印出来的进程号就可以一目了然了,我就不赘述了。

原文地址:http://www.qianchusai.com/linux%E7%B3%BB%E7%BB%9Ffork.html

我拥有的快乐真多作文,我拥有的快乐真多作文500字初中

我拥有的快乐真多作文,我拥有的快乐真多作文500字初中

cc/腿上湿疹图片,腿上湿疹是何原因引起

cc/腿上湿疹图片,腿上湿疹是何原因引起

自强自立的小故事50字

自强自立的小故事50字

写景状物渲染气氛的开头,写景状物渲染气氛的开头和结尾

写景状物渲染气氛的开头,写景状物渲染气氛的开头和结尾

写一篇关于生物学的作文初一,写一篇关于生物学的作文初一下册

写一篇关于生物学的作文初一,写一篇关于生物学的作文初一下册

一年级一件有趣的事20字,小学一年级作文一件有趣的事

一年级一件有趣的事20字,小学一年级作文一件有趣的事

樊登可复制的领导力心得,樊登可复制的领导力心得体会1000字

樊登可复制的领导力心得,樊登可复制的领导力心得体会1000字

大班古诗从军行教案,古诗从军行教案幼儿园

大班古诗从军行教案,古诗从军行教案幼儿园

初中作文用得上的好词好句,初中作文用得上的好词好句摘抄大全

初中作文用得上的好词好句,初中作文用得上的好词好句摘抄大全

我喜欢的动物小白兔800,我喜欢的动物小白兔二年级写话

我喜欢的动物小白兔800,我喜欢的动物小白兔二年级写话