Почему используется clone(), а не fork()?

Я работаю над трубами и вилками. У меня есть этот вывод strace, однако я не уверен, почему используется клон, а не вилка. Значит ли это, что они одинаковые?

Выход Strace

enter codexecve("./forks", ["./forks"], [/* 55 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f2b0e498700) = 0
pipe([3, 4])                            = 0
clone(Process 7304 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2b0e4989d0) = 7304
[pid  7303] execve("/usr/bin/wc", ["wc", "-l"], [/* 55 vars */] <unfinished ...>
[pid  7304] execve("/bin/ls", ["ls"], [/* 55 vars */] <unfinished ...>
[pid  7303] <... execve resumed> )      = 0
[pid  7304] <... execve resumed> )      = 0
[pid  7303] arch_prctl(ARCH_SET_FS, 0x7f558acde700) = 0
[pid  7304] arch_prctl(ARCH_SET_FS, 0x7f4bef4f67c0) = 0
[pid  7304] exit_group(0)               = ?
Process 7304 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
21
exit_group(0) 

1 ответ

Нет, fork() а также clone() не то же самое. Тем не менее, вы можете представить их обоих как функции, используемые в качестве оберток вокруг clone() системный вызов, что означает, что они используют один и тот же clone() Внутренний системный вызов для создания нового процесса. Это объясняет, что вы наблюдали на straceвыходной.

Проверьте это и этот вопрос; они объясняют различия лучше, чем я мог.

Другие вопросы по тегам