|
Системный вызов waitpid ( его номер 7 ) ждет завершения процесса, ид которого указано в первом параметре, после
этого работа программы продолжается, в системный вызов передается 3 параметра, первый - ид процесса,
завершение которого мы будем ждать, второй - куда нам передать код завершения процесса, если он нам не нужен, то этот параметр
равен 0, и третий опции, пока они нам не пригодятся, поэтому тоже передадим ноль. В дальнейшем я собираюсь использовать этот системный
вызов совместно с вызовами подмены процесса из группы execv, ну а сейчас пусть будет немного переделанный пример из примера системного вызова fork,
простой, но наглядный примерчик.
.data
msg1:         # Сообщение дочернего процесса
        .ascii " Hello, world! i am child proc! "
len1 = . - msg1
msg2:         # Приветствие родительского процесса
        .ascii " Hello, world! i am parent proc! I wait for terminate child proc! "
len2 = .-msg2
msg3:         # Сообщение родительского процесса после завершения дочернего
        .ascii " Child proc was terminated! "
len3 = . - msg3
.text
.global _start
_start:
movl $len2,%edx         # Выводим приветствие
movl $msg2,%ecx
movl $1,%ebx
movl $4,%eax
int $0x80
movl $2,%eax         # Разделяем потоки
int $0x80
testl %eax,%eax
jz _middle
pushl %eax         # здесь я сохраняю аккумулятор в стек
# так как в нем ид дочернего потока, можно было и сразу переписать его в ebx
# но я сделал через стек, чтобы здесь можно было вставить код, не опасаясь потерять ид
# дочернего процесса
popl %ebx         # тут уже выталкиваю ид процесса в ebx - первый параметр вызова waitpid
xorl %edx,%edx         # зануляю остальные два параметра, делаю это логической операцией xorl
xorl %ecx,%ecx         # так как она и места и времени меньше занимает у процессора
movl $7,%eax         # номер вызова waitpid в аккумулятор
int $0x80         # вызов
movl $len3,%edx         # выводим сообщение о завершении дочернего процесса
movl $msg3,%ecx
movl $1,%ebx
movl $4,%eax
int $0x80
_exit:         # Выход
movl $0,%ebx
movl $1,%eax
int $0x80
_middle:         # дочерний процесс
movl $len1,%edx         # Выводим сообщение дочернего процесса
movl $msg1,%ecx
movl $1,%ebx
movl $4,%eax
int $0x80
jmp _exit         # Прыгаем на выход
# ВСЕ!
Непосредственно вводимый код выделен фиолетовым цветом , все остальное(зеленым) - комментарии.
Компилируем так
as -s -o waitforproc.o waitforproc.s
ld -s -o waitforproc waitforproc.o
скачать архив с исходным кодом и исполняемым файлом этого примера
tar.gz
zip
С уважением Pauk_pv ©
|