QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4165|回复: 8

求助:fork系统调用

[复制链接]
发表于 2005-11-10 22:52:11 | 显示全部楼层 |阅读模式
关于fork系统调用看了好多资料,可是对于它的一次调用两次返回一直都没有想清楚,为什么在父进程中返回子进程号,在子进程中返回0。不知哪位大虾可否讲解一下fork的详细执行过程,小弟不胜感激!
 楼主| 发表于 2005-11-14 17:02:04 | 显示全部楼层
是不是这个问题过于简单,大家都不愿意回答啊! :-(
回复

使用道具 举报

发表于 2006-6-28 14:05:30 | 显示全部楼层
wb_pla810509
是啊,这个问题确实不难,但是入门的还是比较难的。
回复

使用道具 举报

发表于 2006-7-6 15:42:31 | 显示全部楼层
这个不好讲啊,自己明白,就是讲不出来。
回复

使用道具 举报

发表于 2006-7-8 13:05:23 | 显示全部楼层

或许

使用fork()时,在进程调度前,只有我们称之为父进程的进程运行,当fork()返回时,存在两个进程,父进程,和子进程。关键是,这两个进程都运行相同的程序,而他们的区别就是fork的返回值。
<0,存在错误。
0:子进程
>0父进程
回复

使用道具 举报

发表于 2006-7-13 11:56:14 | 显示全部楼层
你可能把fork和Windows上的CreateProcess给搞糊涂了。这是Unix和Windows最大的区别之一。
回复

使用道具 举报

发表于 2006-7-18 19:17:12 | 显示全部楼层
你看一下内核的do_fork()函数。
回复

使用道具 举报

发表于 2006-7-25 15:02:32 | 显示全部楼层
fork()使用写时拷贝(copy-on-write)的技术,顾名思义,这是一种在写的时候(即需要的时候)才执行拷贝(父进程的大部分信息,只有PPID、PID、某些资源、和统计量)的技术。新建的进程会得到其父进程的大部份信息。
fork()调用clone(),然后clone()又去调用do_fork(),do_fork()又调用copy_process(),下面是copy_process的执行过程
1、调用dup_task_struct()为新进程创建内核栈、thread_info和task_struct,这些都和它的爸爸相同;
2、检查新创建的这个子进程之后当前用户所拥有的资源是不是超出了限制
3、这个儿子长大了,他开始和他的老爸(父进程)区别开来。进程描述符内的许多成员都要被清0设为初始值。
4、子进程的状态被设为TASK_UNINTERRUPTIBLE,以保证它不会投入运行
5、copy_process()调用copy_flags()以更新task_struct的flags成员。表明进程是否拥有超级用户权限的PF_SUPERPRIV标志被清0.表明进程还没有调用exec()函数的PF_FORKNOEXEC标志被设置。
6、调用get_pid()为新进程获取一个有效的PID。
7、根据传递给clone()的参数标志,copy_process()拷贝或共享打开的文件、文件系统信息、信号处理函数、进程地址空门和命名空间等。
8、父进程和子进程平分剩余的时间片
9、最后,copy_process()作扫尾工作,并返回一个指向子进程的指针。

这些书上都有的。
回复

使用道具 举报

发表于 2006-8-15 02:36:50 | 显示全部楼层
这里有篇好贴子,相信看过的人都会明白。
http://www.chinaunix.net/jh/23/311067.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-29 06:48 , Processed in 0.077748 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表