首页 > 试题广场 >

下列关于 clone 和 fork 的区别描述正确的有?

[单选题]
下列关于 clone 和 fork 的区别描述正确的有?
  • clone和fork最大不同在于fork不再复制父进程的栈空间,而是自己创建一个新的。
  • clone和fork最大不同在于clone不再复制父进程的栈空间,而是自己创建一个新的。
  • clone是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等
  • fork是clone的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等
推荐
答案C 
解释:

fork() 函数复制时将父进程的所以资源都通过复制数据结构进行了复制,然后传递给子进程,所以 fork() 函数不带参数; clone() 函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定,所以 clone() 函数带参数,没有复制的资源可以通过指针共享给子进程
编辑于 2015-01-27 15:15:54 回复(2)
fork()是全部复制
vfork()是共享内存
clone()是可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的clone_flags来决定。另外,clone()返回的是子进程的pid。
编辑于 2016-06-01 14:40:17 回复(3)
答案:C
fork是复制进程,创建一个新的进程,不带参数
clone是可选的复制父进程资源,可以通过参数控制复制的内容
发表于 2015-01-26 20:37:32 回复(0)
fork() 函数复制时将父进程的所以资源都通过复制数据结构进行了复制,然后传递给子进程,所以 fork() 函数不带参数; clone() 函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定,所以 clone() 函数带参数,没有复制的资源可以通过指针共享给子进程
发表于 2022-02-11 13:50:51 回复(0)
C

fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。


发表于 2015-01-26 20:34:42 回复(0)
在C语言中,clone与fork都是创建新进程的系统调用,但它们有以下区别:

1. clone可以控制新进程与原进程共享的资源,包括文件描述符、内存映射、信号处理等;而fork只能共享一些基本的资源,如文件描述符和进程环境变量等。

2. clone可以创建一个线程,而fork只能创建一个完整的进程。

3. clone可以指定新进程的栈空间和入口点,而fork只能复制原进程的上下文。

4. clone返回的是新进程的线程ID(tid),而fork返回的是新进程的进程ID(pid)。

综上所述,clone比fork更加灵活,可以更细粒度地控制新进程的资源和行为,但也更加复杂。在大多数情况下,使用fork就可以满足需求。
发表于 2023-04-15 18:33:07 回复(1)
fork之后,子进程会拷贝父进程的堆、栈和数据空间,由于写时复制技术,未发生修改时两者的物理地址是一样的,但逻辑地址并不一样,clone则是有选择地拷贝,故选C。
发表于 2018-11-27 17:33:44 回复(0)
一般在什么时候用到?
发表于 2023-02-09 17:28:46 回复(0)
https://blog.csdn.net/weixin_31083901/article/details/116899575
发表于 2022-07-04 00:11:47 回复(0)
fork是复制进程,创建一个新的进程,不带参数 clone是可选的复制父进程资源,可以通过参数控制复制的内容
发表于 2017-06-11 23:15:55 回复(0)
  • execve() replaces the current executable image with another one loaded from an executable file.
  • fork() creates a child process.
  • vfork() is a historical optimized version of fork(), meant to be used when execve() is called directly after fork(). It turned out to work well in non-MMU systems (where fork()cannot work in an efficient manner) and when fork()ing processes with a huge memory footprint to run some small program (think Java's Runtime.exec()). POSIX has standardized the posix_spawn() to replace these latter two more modern uses of vfork().
  • posix_spawn() does the equivalent of a fork()/execve(), and also allows some fd juggling in between. It's supposed to replace fork()/execve(), mainly for non-MMU platforms.
  • pthread_create() creates a new thread.
  • clone() is a Linux-specific call, which can be used to implement anything from fork() to pthread_create(). It gives a lot of control. Inspired on rfork().
  • rfork() is a Plan-9 specific call. It's supposed to be a generic call, allowing several degrees of sharing, between full processes and threads.

clone()是linux版本的系统调用,提供大量控制,可以选择实现从pthread_create到fork所提供的功能



ref:
http://stackoverflow.com/questions/4856255/the-difference-between-fork-vfork-exec-and-clone
发表于 2016-06-26 15:42:05 回复(0)