Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- # масив для виклику cat log.txt
- cmd_cat: .string "/bin/cat"
- arg_cat: .string "log.txt"
- args_cat: .long cmd_cat, arg_cat, 0
- # масив для виклику wc –l
- cmd_wc: .string "/usr/bin/wc"
- arg_wc: .string "-l"
- args_wc: .long cmd_wc, arg_wc, 0
- # масив файлових дескрипторів для pipe
- fds: .int 0, 0
- .text
- .globl _start
- _start:
- # виклик pipe(fds)
- pushl $fds
- call pipe
- # виклик fork()
- call fork
- # перехід до коду дочірнього процесу для cat,
- # якщо fork повернув 0
- cmpl $0, %eax
- je child_cat
- # виклик fork() у батьківському процесі
- call fork
- # перехід до коду дочірнього процесу для wc,
- # якщо fork повернув 0
- cmpl $0, %eax
- je child_wc
- # close(fd[0]) у батьківському процесі
- movl $fds, %eax
- pushl 0(%eax)
- call close
- # close(fd[1]) у батьківському процесі
- movl $fds, %eax
- pushl 4(%eax)
- call close
- # виклик wait(NULL) - для cat
- pushl $0
- call wait
- # ще один виклик wait(NULL) - для wc
- pushl $0
- call wait
- finish:
- # виклик exit(0)
- movl $1, %eax
- movl $0, %ebx
- int $0x80
- # код дочірнього процесу для cat
- child_cat:
- # виклик dup2(fds[1],1)
- pushl $1
- movl $fds, %eax
- pushl 4(%eax)
- call dup2
- # виклик close(fds[0]), close(fds[1])
- movl $fds, %eax
- pushl 0(%eax)
- call close
- movl $fds, %eax
- pushl 4(%eax)
- call close
- # виклик execve(cmd_cat, args_cat)
- pushl $args_cat
- pushl $cmd_cat
- call execve
- call finish
- # код дочірнього процесу для wc
- child_wc:
- # виклик dup2(fds[0],0)
- pushl $0
- movl $fds, %eax
- pushl (%eax)
- call dup2
- # виклик close(fds[0]), close(fds[1])
- movl $fds, %eax
- pushl 0(%eax)
- call close
- movl $fds, %eax
- pushl 4(%eax)
- call close
- # виклик execve(cmd_wc, args_wc)
- pushl $args_wc
- pushl $cmd_wc
- call execve
- call finish
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement