логотип нашего сайта о программировании для начинающих

Программирование на ассемблере для начинающих. Ассемблер gas под linux, fasm под windows, tasm под dos, и многое другое.


Сайт для программистов, начинающих кодеров, и людей, желающих заняться программированием.



Меню невыпадающее
Программистам : Другое :

Системный вызов fork - многопоточность на GAS

Системный вызов sys_fork ядра linux создает новый поток, причем в поток-родитель , он возвращает идентификатор потока-потомка, а в поток-потомок возвращает 0, исключение - при ошибке в поток-родитель возвращается -1, а поток-потомок естественно не создается. Но лучше покажу на примере:

.data                                         # Секция данных
msg1:                                       # строка выводимая дочерним потоком
.ascii " Hello, world! i am child proc! "
len1 = . - msg1                         # Её длина
msg2:                                       # Строка выводимая родительским потоком
.ascii " Hello, world! i am parent proc! "
len2 = . - msg2                         # Её длина
.text                                         # Секция текст
.global _start                             # Начало программы
_start:
movl $2,%eax                         # номер вызова fork
int $0x80                                 # вызов fork
testl %eax,%eax                       # проверка аккумулятора
jz _middle                               # если 0, то это дочерний поток
movl $len2,%edx                         # если нет то родитель
movl $msg2,%ecx                         # пишем родительскую
movl $1,%ebx                               # строку
movl $4,%eax                               # на экран
int $0x80
movl $0,%ebx                               # завершаем
movl $1,%eax                               # родительский поток
int $0x80
_middle:                                         # мы в дочернем потоке
movl $len1,%edx                               # пишем дочернюю
movl $msg1,%ecx                               # строку
movl $1,%ebx                                 # на экран
movl $4,%eax
int $0x80
_exit:                                         # завершаем
movl $0,%ebx                               # дочерний
movl $1,%eax                               # поток
int $0x80                                         # всё!

Вот в принципе и все, осталось добавить , что дочерних потоков можно создавать очень много, только надо помнить, что максимальное количество всех потоков в системе = 1024, при превышении этого лимита в аккумулятор будет возвращаться -1 и потоки создаваться не будут, но я ещё пройдусь по теме потоков в описании системного вызова sys_waitpid, который ожидает завершения указанного в параметрах потока, ждите.

Скачать исходный код и исполняемый файл в архиве
tar.gz
zip


Здесь со времнем появятся ссылки дружественных и понравившихся сайтов

Информер ТИЦ

ресо спб

Сайт создан Pauk_pv // Pauk@paukpv.pp.ru

Rambler's Top100 Каталог@MAIL.RU - каталог ресурсов интернет

При использовании информации с сайта обязательна ссылка на сайт
Pauk_pv ©