LINUX.ORG.RU

fork(), clone().....


0

0

Изучаю программирование под Linux. Для создания потоков использую функцию pthread_create() из библиотеки Pthreads, для создания потомков(порождения процессов) использую функцию fork(). Сегодня прочитал что и то и другое является оберткой для системного вызова clone(), но если для потоков вроде понятно, то fork() я считал системным вызовом, а не оберткой. Вопрос в том так ли это? Насколько я понимаю это было до 2.4.23, т.е. до того как потоки перестали быть линуксовыми(т.е. почти процессами). При вызове clone() существует ограничения на возвращаемое значение - значит кроме clone() должен существовать системный вызов для создания потоков? Если что не так не ругайте сильно, просто поправте где не прав, где можно об этом прочитать(желательно на русском), какие библиотеки и сис. вызовы( fork, clone, etc.) используют в своей работе профи и почему, в вдух словах.

anonymous

clone() является обобщением функций fork() и pthread_create().
Она позволяет вызывающему процессу указывать , какие рессурсы
он согласен делить с дочерним процессом.Необходимо также задать область памяти , в которой будет расположен стек выполнения нового
процесса.Вообще говоря , мы упоминаем функцию clone() лишь для того чтобы удовлетворить любопытство читателей.Использовать её в программах не следует.

Программирование для Линукс.
Марк Митчелл
Джеффри Оулдем
Алекс Самьюэл

kitov ★★★
()
Ответ на: комментарий от kitov

Потому как fork() это UNIX, а clone() это всего лишь Linux (но идея с clone мне нравится больше )

anonymous
()
Ответ на: комментарий от kitov

Программирование для Линукс Марк Митчелл ........

Именно по этой книге я и изучаю программирование :)

Просто стало интерестно fork это системный вызов или обертка для clone. И еще есть ли системный вызов для потоков или это и есть clone. Теперь потоки стали ntpl как это понять?

anonymous
()
Ответ на: комментарий от anonymous

Профессионалы часто используют вместо fork - vfork. Это на порядок увеличивает производительность за счет того, что память процесса _НЕ_ копируется для создания потомка.

anonymous
()
Ответ на: комментарий от anonymous

> Профессионалы часто используют вместо fork - vfork.

надеюсь, эти профессионалы делают это не слишком часто.

vfork() - очень специальный вызов. например, parent
будет спать до тех пор, пока child не сделает exit()
или exec().

idle ★★★★★
()
Ответ на: комментарий от anonymous

Но ведь vfork в линуксе не совсем то что надо - ведь память копируется

только при попытке записи(cow - copy on write), а если после fork

сразу вызвать exec, то vfork не имеет преимущесвт перед fork. vfork

для того и был создан,это касаемо linux для других систем не знаю.

stalcker
()
Ответ на: комментарий от stalcker

> Но ведь vfork в линуксе не совсем то что надо - ведь память копируется
> только при попытке записи(cow - copy on write), а если после fork
> сразу вызвать exec, то vfork не имеет преимущесвт перед fork.

именно в этом случае он имеет преимущество перед fork().
больше того, это практически единственный случай, когда
этот вызов имеет смысл.

все это уже обсуждалось, например
http://www.linux.org.ru/view-message.jsp?msgid=235834
в конце.

idle ★★★★★
()
Ответ на: комментарий от idle

Почитал по ссылке, man vfork(что бы не было вопросов):
vfork, just like fork(2), creates a child process of the calling process. For
details and return value and errors, see fork(2).

vfork() is a special case of clone(2). It is used to create new processes without
copying the page tables of the parent process. It may be useful in performance
sensitive applications where a child will be created which then immediately issues
an execve().

vfork() differs from fork in that the parent is suspended until the child makes a
call to execve(2) or _exit(2). The child shares all memory with its parent,
including the stack, until execve() is issued by the child. The child must not
return from the current function or call exit(), but may call _exit().

stalcker
()
Ответ на: комментарий от stalcker

а с какого времени fork & vfork под линуксом есть вещи разные???

раньше под линуксом vfork просто транслировался в fork. кажись на уровне libc

cvv ★★★★★
()
Ответ на: комментарий от idle

>> а с какого времени fork & vfork под линуксом есть вещи разные???

>в 2.2 уже разные

спасибо, но я читал в одной довольно авторитетной книге что ето одно и тоже по крайней мере для ядер 2.2

cvv ★★★★★
()
Ответ на: комментарий от cvv

> > в 2.2 уже разные
>
> спасибо, но я читал в одной довольно авторитетной книге что
> ето одно и тоже по крайней мере для ядер 2.2

;) как говаривал Николай Васильевич Гоголь
"тому не надо читать статей, кто может читать код."

$ grep -A 3 sys_vfork 2.20/arch/i386/kernel/process.c
asmlinkage int sys_vfork(struct pt_regs regs)
{
        return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, &regs);
}

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.