Создание потока (Не используя fork() и exec())

Модератор: Модераторы разделов

fleisch
Сообщения: 40
ОС: OpenSuSE Linux 11.1

Создание потока

Сообщение fleisch »

Возник вопрос, можно ли просто вызвать функцию по ходу программы отдельным потоком и продолжить выполнение программы, не обращая внимание на работу той функции, не используя все эти fork() и exec() ??
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Создание потока

Сообщение Zeus »

Поток-то вроде как pthread_create создаёт.
А fork и exec создают новые процессы.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Создание потока

Сообщение RasenHerz »

в Linux создание потока == вызов do_fork() со спец.флагами(думаю их не имеет смысла перечислять). так что хотите ли вы этого или нет, а fork() будет)))
кста, почему такое ограничение???
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Создание потока

Сообщение AestheteAnimus »

RasenHerz писал(а):
17.09.2008 00:26
в Linux создание потока == вызов do_fork() со спец.флагами

А можно с этого места поподробнее?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Создание потока

Сообщение Rootlexx »

fleisch писал(а):
16.09.2008 20:52
Возник вопрос, можно ли просто вызвать функцию по ходу программы отдельным потоком и продолжить выполнение программы, не обращая внимание на работу той функции, не используя все эти fork() и exec() ??

clone() (2) :).
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Создание потока

Сообщение RasenHerz »

AestheteAnimus писал(а):
17.09.2008 00:42
RasenHerz писал(а):
17.09.2008 00:26
в Linux создание потока == вызов do_fork() со спец.флагами

А можно с этого места поподробнее?

подробнее в исходниках ядра.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Создание потока

Сообщение nesk »

RasenHerz писал(а):
17.09.2008 15:53
AestheteAnimus писал(а):
17.09.2008 00:42
RasenHerz писал(а):
17.09.2008 00:26
в Linux создание потока == вызов do_fork() со спец.флагами

А можно с этого места поподробнее?

подробнее в исходниках ядра.

строго говоря - do_fork() не является системным вызовом, это внутренняя функция ядра, недоступная напрямую через интерфейс системных вызовов.
fork обрабатывается функцией ядра sys_fork() в которой просто вызывается do_fork() с нужными флагами
системный вызов clone обрабатывается функцией ядра sys_clone() в которой просто вызывается do_fork() с нужными флагами
clone - более гибкий системный вызов по сравнению с fork.
Но о наличии do_fork() прикладной программист думать и догадываться не должен (это ничем не стандартизированные тонкости реализации нитей в линукс), кроме того, прикладной программист для создания нити не должен даже обращаться к clone. Если мы хотим создать мобильный код - надо использовать pthread_create
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Создание потока

Сообщение AestheteAnimus »

nesk писал(а):
17.09.2008 16:54
Но о наличии do_fork() прикладной программист думать и догадываться не должен (это ничем не стандартизированные тонкости реализации нитей в линукс).


Такая релизация потоков, через do_fork, - чисто линуксовая? Или же это свойственно для всех nix систем (меня прежде всего интересует FreeBSD)?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Создание потока

Сообщение Portnov »

fleisch, действительно, откуда такое ограничение? Если просто лень изучать man 2 fork и man 3 exec - ну, изучите man 3 system ;) Пример: system("/path/to/program &");

Я так понимаю, под словом 'поток' подразумевается просто асинхронное выполнение, а не thread.

Конкретно название функции и конкретный механизм - скорее всего, чисто линуксовая специфика (за подробностями, действительно, см. исходники). Но принцип - что потоки мало отличаются от процессов - родовая черта всех юниксов (исключение, афаик - solaris).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали: