linux进程fork
❶ linux中的fork函数到底做了什么事
额........每启动一个进程并不一定要执行fork.fork只是系统最后封装的一个系统调用.你在程序里不使用fork的话.使用其它方式启动进程.就不是fork.fork族里有很多函数...............exec也可替换当前进程......系统内核里生成一个进程用的是clone这个函数.
就比如要盖个房子.一个人干,要先挖土再调水泥再摆砖头再盖墙这样一步一步做.但是如果有多个人.就是可以多个人同时做这些事,一个挖土,一个调水泥.一个摆砖头.这样就省了很多时间.进程也是如此.fork的作用就是创建新进程.
这么多人一起盖房子,总不能各自盖各自的,需要大家协调来做.不能土没挖好就摆砖,没放砖就抹水泥一样.这个时候需要一个工头来管理大家.工头通过每个人的名字来指挥每个人干活.进程就通过pid来指挥一个进程干活.工人需要知道自己的工头是谁,好向他报告碰到的情况.进程需要知道自己的父进程是谁报告自己的情况.
这样就明白fork为何要返回进程的id了吧?fork是不会返回父进程的id的.
工头找了一个新工人干活.从工头知道这个新工人的名字时刻开始,新工人就会投入这个团队一起干活了.fork返回pid的时候就表示这个进程在这个进程团队里了.工头可以直接告诉工人要干什么而不会让其他工人误以为这是自己的活.但是程序并没有这么智能.这个时候就需要有一个状态(if(!pid){....这是工人干的活...})表明这个工人的代码从什么位置开始,到什么位置结束.
❷ 请教linux下fork()创建子进程
pid = fork(); //创建进程命令点
if(pid < 0){...} //pid<0,表示fork出错,程序一般会退出,不会出现pid=0和pid>0的情况
else if(0 == pid){...} //从这个点开始,程序出现分支 pid=0表示fork出来的子进程分支
else{....} //否则是原进程,即父进程
printf("here!"); //如果在上面两个进程都没有exit()操作时,执行完{}中的命令,都会走到这里
关于fork出来的父子进程关系,请仔细阅读linux高级编程中进程一章节,内容很多,细细的阅读并练习体会吧
❸ linux fork() 进程问题
没看明白你是怎么理解的
就按照你的代码示例来说, 这段代码从A进程fork一个B进程出来,运行结果是打印4行消息
child id xxx1 // pid of process A
parent id xxx2 // pid of A's parent process
child id xxx3 // pid of process B
parent id xxx4 //pid of B's parent process, exactly equal to the pid of process A
以上这四行输出有可能A在B的前面,或者B在A的前面,不确定(如果你的CPU是多核);但child总在parent的前面。
事实上关于fork的理解是这样的, A fork一个进程B出来, A和B都要接着往下运行,但是一般来说A和B是要运行不同的代码的,那这时候fork执行完接着执行下一句的时候,就需要首先知道当前的context是在A进程中还是在B进程中, 这样才能确定接着执行什么。 所以fork就需要返回两次, 确切的讲是在A和B的context中分别返回一次,在A的context中返回的是子进程的pid, 在B的context中返回0,所以创建进程时往往会这样写
int ret = fork();
if(0 == ret)
{
printf("hey, I am the child -- Process B\n");
//start to do what you want to handle in Process B
}
else //if ret > 0
{
printf("hey, I am the parent -- Process A\n");
//continue doing what you are working on in Process A
}
通过判断 fork的返回值来确定当前context是属于哪个进程,并执行相应的代码,开始在两个进程中做各自的事情。
❹ Linux应用程序中出现两次fork的解释
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
在一些程序中经常看见使用两次fork创建子进程,原因如下:
以下摘自《UNIX环境高级编程》
如果一个进程fork一个子进程,但不要它等待子进程终止,也不希望子进程处于僵死状态直到父进程终止,实现这一要求的技巧是调用fork两次。程序如下:
#include
"apue.h"
#include
<sys/wait.h>
int
main(void)
{
❺ linux中的fork是创建进程还是线程
fork是创建进程,pthread是线程。
❻ linux 创建进程为什么fork
创建子进程才能多道程序并发执行,linux初始化的时候会创建swap进程、然后是init进程和一个init进程的兄弟进程,所有的进程(运行的程序)都是从父进程演化出去的,你可以看看proc里的东西,写个程序打印出各个进程的父进程~网上有源代码的,要的话我给你咱要先搞明白进程究竟是什么,进程是资源分配的单位,是运行的程序。既然是运行的程序,一个进程自然只能代表一个程序,多道程序设计自然而然就有了多进程的概念。举个例子,多进程(线程)下载,我们可以给一个需要下载的资源分片,多个进程从不同的片分时下载,这样就提高了下载速度,因为对一个程序分配的更多的资源,你试试开迅雷的时候打开个网页,保证你觉得奇卡无比,因为网络带宽(资源)被迅雷的多个进程占用了。其实在本地的多进程程序并不多见,比如word算是个典型的多进程程序,有个进程接受你的键盘输入,有拼写检查进程,有显示进程等等。大多数都用到网络上了,比如服务器。一台服务器要在“同一时间”处理来自很多客户端的请求,这就必须使用多进程。
❼ 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()
= OR ==
你初学者吧,请把赋值 =
和 == 值比较 搞清楚啊
= value assignment
== value compare
❾ linux中fork创建进程 新进程是从头开始执行吗
fork系统调用是“复制”进程,所以复制出来的子进程是从代码的最开始从头执行的。如果是要用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上控制子进程。