社区
Linux_Kernel
帖子详情
大家来一起讨论一下系统调用fork() clone() vfork() 我开个头
xjgarchermind
2011-07-22 11:58:00
看内核代码介绍有关
fork()
clone()
vfork()
3个系统调用
看了看介绍
感觉还是没法能够真正理解其内涵
所以贴出来大家一起讨论一下!
...全文
162
15
打赏
收藏
大家来一起讨论一下系统调用fork() clone() vfork() 我开个头
看内核代码介绍有关 fork() clone() vfork() 3个系统调用 看了看介绍 感觉还是没法能够真正理解其内涵 所以贴出来大家一起讨论一下!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xjgarchermind
2011-08-05
打赏
举报
回复
不结贴 这个课题就是用来讨论学习的 呵呵 大家对这3个系统函数有什么独到见解都可以发表一下啊
xjgarchermind
2011-08-05
打赏
举报
回复
[Quote=引用 13 楼 bokutake 的回复:]
引用 11 楼 qiyu1988 的回复:
fork()运行后会把父进程的数据、堆栈等资源复制一份,很耗内存
不会的耗费内存和时间的,UNIX中就已经引入写时复制技术了。复制用户控件时只是简单的在内存页表上,做个重复的映射。新的进程的虚拟内存空间和原来的进程虚拟内存空间映射到同一个物理内存上。通过页写保护位,当时图写入内存页时,内核再分配新的物理内存来只复制那个要修改的页。
[/Quote]
领教了 你的意思是 fork的时候 不是马上进行内存数据复制? 而是等到要用到某些数据时 再另行拷贝? 但是父进程还在运行的话 如何保证数据的一致呢 因为拷贝时候的点数据场景 变了啊
LoveZhanHaiTao
2011-08-05
打赏
举报
回复
觉得你好像我一个朋友的,直觉告诉我的!呵呵!小意
辰岡墨竹
2011-08-05
打赏
举报
回复
[Quote=引用 11 楼 qiyu1988 的回复:]
fork()运行后会把父进程的数据、堆栈等资源复制一份,很耗内存
[/Quote]
不会的耗费内存和时间的,UNIX中就已经引入写时复制技术了。复制用户控件时只是简单的在内存页表上,做个重复的映射。新的进程的虚拟内存空间和原来的进程虚拟内存空间映射到同一个物理内存上。通过页写保护位,当时图写入内存页时,内核再分配新的物理内存来只复制那个要修改的页。
wangzi851011
2011-08-02
打赏
举报
回复
我顶~!~~
qq495591230
2011-08-02
打赏
举报
回复
不会!!!!!!!!!!!!!!1
jiahehao
2011-08-02
打赏
举报
回复
楼主结帖率为0。。。。。。。
qiyu1988
2011-08-02
打赏
举报
回复
fork()运行后会把父进程的数据、堆栈等资源复制一份,很耗内存
翔云123456
2011-07-31
打赏
举报
回复
另外,fork vfork都是调用了clone
最后clone调用do_fork
翔云123456
2011-07-31
打赏
举报
回复
fork():创建时,飞父进程与子进程暂时共享代码和数据,只要有一个改变共享代码数据,就会各自得到一个拷贝
vfork():
父与子共享代码数据,创建子进程后,父进程要等待,直到子进程运行完毕,父进程才继续执行
昵称很不好取
2011-07-22
打赏
举报
回复
fork后的子进程共享父进程的代码
xjgarchermind
2011-07-22
打赏
举报
回复
首先我们贴一段应用代码来做分析
#include <stdio.h>
int main()
{
int child;
char *args[] = { "/bin/echo", "Hello", "World!", NULL};
if (!(child = fork()))
{
/* child */
printf("pid %d: %d is my father\n", getpid(), getppid());
execve("/bin/echo", args, NULL);
printf("pid %d: I am back, something is wrong!\n", getpid());
}
else
{
int myself = getpid();
printf("pid %d: %d is my son\n", myself, child);
wait4(child, NULL, 0, NULL);
printf("pid %d: done\n", myself);
}
return 0;
}
首先main函数肯定是父进程了
当调用fork后,返回时,子进程产生了
那么子进程从哪儿开始执行呢?
xjgarchermind
2011-07-22
打赏
举报
回复
实际上 我看了内核代码的进程介绍也是云里雾里
比如说fork,看这意思它只是复制了父进程的task_struct数据结构,如果没有自己的执行体,显然就没什么意义了 那么就只能共享父进程的执行体了 即fork返回后的地方开始执行
那么上面这段代码 父进程fork返回的地方是if (!(child = fork()))
子进程判断这个返回值
可为何又是等于0开始的
{
/* child */
printf("pid %d: %d is my father\n", getpid(), getppid());
execve("/bin/echo", args, NULL);
printf("pid %d: I am back, something is wrong!\n", getpid());
}
是自己的执行体呢?
这又怎么理解呢?
还有系统调用返回后回到用户空间 必然存在着进程调度
那么这个时候的CPU会去执行哪个进程呢?
父进程?
还是刚刚创建的子进程呢?
dongjiawei316
2011-07-22
打赏
举报
回复
clone()创建一个子进程,并可以指定进程开始运行的位置。实际上由于linux下并没有完全意义上的线程概念,如果clone创建的这个子进程和父进程共享内存空间的话,那么他就是linux下,我们通常认为的线程了。
name_110
2011-07-22
打赏
举报
回复
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本,同时共享代码段。
所以,fork返回后他们都将执行接下来相同的代码
为了区分父进程和子进程,fork返回0表示子进程,fork返回非0表示父进程
那么子进程从哪儿开始执行呢? 子进程从fork()语句返回后就开始执行了
详解linux中
fork
、v
fork
、
clone
函数的区别
在Linux操作
系统
中,`
fork
()`、`v
fork
()` 和 `
clone
()` 都是用于创建新进程的函数,但它们在实现机制和使用场景上存在显著差异。 1. **
fork
()** `
fork
()` 是最传统的进程创建方法。它创建一个与父进程完全独立的新...
v
fork
() 函数详解示例代码
在Linux
系统
编程中,`v
fork
()`函数是一个特殊版本的进程创建函数,它与我们常见的`
fork
()`函数有所不同。本文将深入探讨`v
fork
()`函数的详细知识,并提供相关示例代码来帮助理解。 首先,`v
fork
()`的主要特点是创建...
linux
fork
简单使用
在Linux
系统
编程中,`
fork
()`, `exit()` 和 `exec()` 这三个
系统
调用
是构建多进程程序的关键组成部分。它们允许程序创建新的进程、结束当前进程以及替换当前进程的执行上下文,从而实现复杂的功能和服务。 ### `...
linux内核 do_
fork
函数源代码浅析
do_
fork
函数被 sys_
fork
()、sys_
clone
() 和 sys_v
fork
() 等
系统
调用
所
调用
,以实现进程的复制与创建。 #### 二、do_
fork
函数的工作原理 do_
fork
() 函数主要负责创建一个新的进程,并对其进行初始化。该过程可以...
linux进程创建详解
`sys_v
fork
()` 同样
调用
`do_
fork
()`,但传递了 `
CLONE
_V
FORK
|
CLONE
_VM | SIGCHLD` 的组合标志。`
CLONE
_V
FORK
` 用于确保子进程在执行 `exec` 或退出之前不会运行;`
CLONE
_VM` 表明子进程将继承父进程的虚拟内存,...
Linux_Kernel
4,465
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章