|
Системный вызов 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
|