LINUX.ORG.RU

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


0

0

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

anonymous

Re: fork(), clone().....

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

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

kitov ★★★ ()
Ответ на: Re: fork(), clone()..... от kitov

Re: fork(), clone().....

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

anonymous ()
Ответ на: Re: fork(), clone()..... от kitov

Re: fork(), clone().....

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

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

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

anonymous ()
Ответ на: Re: fork(), clone()..... от anonymous

Re: fork(), clone().....

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

anonymous ()
Ответ на: Re: fork(), clone()..... от anonymous

Re: fork(), clone().....

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

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

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

idle ★★★★★ ()
Ответ на: Re: fork(), clone()..... от anonymous

Re: fork(), clone().....

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

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

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

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

stalcker ()
Ответ на: Re: fork(), clone()..... от stalcker

Re: fork(), clone().....

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

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

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

idle ★★★★★ ()
Ответ на: Re: fork(), clone()..... от idle

Re: fork(), clone().....

Почитал по ссылке, 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 ()
Ответ на: Re: fork(), clone()..... от stalcker

Re: fork(), clone().....

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

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

cvv ★★★★★ ()
Ответ на: Re: fork(), clone()..... от idle

Re: fork(), clone().....

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

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

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

cvv ★★★★★ ()
Ответ на: Re: fork(), clone()..... от cvv

Re: fork(), clone().....

> > в 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 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.